mySQL入門之多表操作

外鍵

初識外鍵

外鍵:引用另一個表中的一列或多列,被引用的列應該具有主鍵約束或唯一性約束。(外鍵用於建立和加強兩個表數據之間的連接,保證數據的完整和統一性)
主表:被引用的表
從表:引用外鍵的表

--例:
CREATE DATABASE duobiao;
USE duobiao;

CREATE TABLE grade(
id INT(4) NOT NULL PRIMARY KEY,
name VARCHAR(20));

CREATE TABLE student(
sid INT(5) NOT NULL PRIMARY KEY,
sname VARCHAR(20),
gid INT(4) NOT NULL);
--student表中的gid是引用了grade表中主鍵(id),即:gid可以作爲student表的外鍵,student表可以用gid連接grade表中的信息,從而建立兩個表數據之間的連接。
--此兩個表的主從關係爲:grade爲主表,student爲從表

爲表添加外鍵約束

語法: alter table 表名 add constraint 外鍵名 foreign key(外鍵字段名) REFERENCES 主表表名(主鍵字段名);

--例:
alter table student add constraint RE_ID foreign key(gid) REFERENCES grade(id);
--查看結果:show create table student;

過程圖

刪除外鍵約束

alter table 表名 drop foreign key 外鍵名;

--例:
alter table student drop foreign key RE_ID;
--查看結果:show create table student;

外鍵的注意事項:

1.建立外鍵的表必須是InnoDB型,不能是臨時表。因爲mySQL中只有InnoDB類型的表才支持外鍵。
2.定義外鍵名時,不能加引號,如:constraint 'NN-ID’或constraint "NN-ID"都是錯誤的。
3.外鍵約束的參數:
(1)cascade:從主表刪除或者更新且自動刪除或更新從表中匹配的行
(2)set null:從主表刪除或更新行,並設置從表中的外鍵行爲null,如果使用該選項,必須保證子表列沒有指定not null
(3)restrict:拒絕對主表的刪除或更新操作。
(4)no action:標準SQL的關鍵字,在mysql中於restrict相同(默認值)xf

操作關聯表

關聯關係

在實際開發中,需要根據實體的內容設計數據表,實體間會有各種關聯關係。所以根據實體設計的數據表之間也存在着各種關聯關係,mySQL中數據表的關聯關係有三種:多對一,多對多,一對一。

(1)多對一

例如:一個班級有多個學生,不能說一個學生屬於多個班級。
兩表間建立外鍵:在多對一的表關係中,應該將外鍵建在多的一方(如:學生),否則會造成數據的冗餘

(2)多對多

例如:訂單與商品,一個訂單中可以有多個商品,一個商品可以放到多個訂單中。
兩表間建立外鍵:通常情況下,爲了實現這種關係需要定義一張中間表(稱爲連接表),該表存在兩個外鍵(分別參照商品表與訂單表)。

(3)一對一

例如:身份證與人,一個人只能有一張身份證,一張身份證只能匹配到一個人。
兩表間建立外鍵:首先,分清主從關係,從表需要主表的存在纔有意義(身份證需要人存在纔有意義),因此,人爲主表,身份證爲從表(在身份證表中建立外鍵)。
應用方面:
1.分割具有很多列的表
2.由於安全原因而隔離表的一部分
3.保存臨時的數據,並且可以毫不費力地通過刪除這些數據

添加數據

因爲外鍵列只能插入參照列存在的值,所以如果要爲兩個表添加數據,就需要先爲主表添加數據

--建立student表與grade表外鍵聯繫
alter table student add constraint RE_ID foreign key(gid) REFERENCES grade(id);
--查看結果
show create table student;
--爲主表添加數據
INSERT INTO grade(id,name)VARCHAR(1,'一年級');
INSERT INTO grade(id,name)VARCHAR(2,'二年級');
--爲從表添加數據
INSERT INTO student(sid,sname,gid)VALUES(1,'李四',1),(2,'張三',1),(3,'王五',2);
--查看結果
SELECT sname FROM student WHERE name='一年級';

刪除數據

先刪除從表中參照列的數據(改爲NULL)或刪除從表數據,然後刪除主表數據

--在student表中,將一年級的學生全部刪除
delete from student where sname='李四';
delete from student where sname='張三';
--在grade表中,將一年級刪除
delete from grade where id=1;
--查看結果
select*from grade;

連接查詢

在關係型數據庫管理系統中,建立表時各個數據之間的關係不必確定,通常將每個實體的所有信息存放在一個表中,當查詢數據時,通過連接操作查詢多個表中的實體信息,當兩個或多個表中存在相同的意義的字段時,便可以通過這些字段對不同的表進行連接查詢,連接查詢包括:交叉查詢,內連接查詢,外連接查詢

交叉連接(少見)

交叉連接返回的結果是被連接的兩個表中所有數據行的笛卡兒積即:返回第一個表中符合查詢條件的數據行數乘以第二個表符合查詢條件的數據行數

語法:SELECT*FROM 表1 CROSS JOIN 表2;
CROSS JOIN用於連接兩個要查詢的表,該語句可以查詢兩個表中所有的數據組合。

--例:
--生成表
USE db2020
CREATE TABLE department(
did INT(4) NOT NULL PRIMARY KEY,
dname VARCHAR(36));

CREATE TABLE employee(
id INT(4) NOT NULL PRIMARY KEY,
name VARCHAR(36),
age INT(2),
did INT(4) NOT NULL);
--插入數據
INSERT INTO department(did,dname)VALUES(1,'IT部'),(2,'公關部'),(3,'人事部');
INSERT INTO employee VALUES(1,'張三',20,1),(2,'李四',20,2),(3,'王五',20,3);
--使用交叉連接查詢
SELECT*FROM department CROSS JOIN employee;

過程圖

內連接(簡單連接或自然連接)

內連接使用比較運算符對兩個表中的數據進行比較,並列出與連接條件匹配的數據行,結合成新的記錄。
語法:SELECT 查詢字段 FROM 表1 [INNER] JOIN 表2 ON 表1.關係字段=表2.關係字段;
INNER JOIN 用於連接兩個表,ON來指定連接條件,其中INNER可以省略。

--例1:
SELECT employee.name,department.dname FROM department JOIN employee ON department.did=employee.did;

過程圖

--例2:
--使用where條件語句來實現同樣的功能
SELECT employee.name,department.dname FROM department,employee WHERE department.did=employee.did;

過程圖

自連接查詢(特殊的內連接):在一個連接查詢中,涉及的兩個表是同一個表。 例如:查詢李四所在部門有哪些員工,就可以使用自連接查詢

SELECT p1.* FROM employee p1 JOIN employee p2 ON p1.did=p2.did WHERE p2.name='李四';

過程圖

外連接

返回查詢結果不僅包含符合條件的數據,而且還包括左表(左連接)右表(右連接)或兩個表(全外連接)中的所有數據,此時就需要使用外連接查詢。

語法:SELECT 所查字段 FROM 表1 LEFT|RIGHT[OUTER] JOIN 表2 ON 表1.關係字段=表2.關係字段 WHERE 條件;

(1)LEFT JOIN(左連接)

返回查詢結果:符合條件的數據和LEFT JOIN子句中指定的左表中所有記錄,如果左表的某條記錄在右表中不存在,則在右表中顯示爲空。

--例:
SELECT department.did,department.dname,employee.name FROM department LEFT JOIN employee ON department.did=employee.did;

過程圖

(2)RIGHT JOIN(右連接)

返回查詢結果:符合條件的數據和RIGHT JOIN子句中指定的右表中所有記錄,如果右表的某條記錄在左表中不存在,則在左表中顯示爲空。

SELECT department.did,department.dname,employee.name FROM department RIGHT JOIN employee ON department.did=employee.did;

過程圖

複合條件連接查詢

複合條件連接查詢即:在連接查詢的過程中,通過添加過濾條件來限制查詢結果,使查詢結果更加精確。

子查詢

子查詢:一個查詢語句嵌套在另一個查詢語句內部的查詢。
它可以嵌套在一個SELECT,SELECT…INTO,INSERT…INTO等語句中。
執行過程:先執行子查詢中的語句,然後將返回的結果作爲外層查詢的過濾條件。
在子查詢中通常可以使用IN,EXISTS,ANY,ALL操作符。

帶IN關鍵字的子查詢

內層查詢語句只返回一個數據列,這個數據列中的值將供外層語句進行比較操作。

--例:
SELECT*FROM department WHERE did IN(SELECT did FROM employee WHERE age=20);

結果圖

帶EXISTS關鍵字的子查詢

EXISTS關鍵字後面的參數可以是任意一個子查詢,這個子查詢的作用相當於測試,它不產生任何數據,只返回TRUE或FALSE,當返回值爲TRUE時,外層語句纔會執行。

帶ANY的關鍵字的子查詢

ANY關鍵字允許創建一個表達式對子查詢的返回值進行比較,只要滿足內層子查詢中任意一個比較條件,就返回一個結果作爲外層查詢條件。

--例:
SELECT*FROM department WHERE did>any(select did from employee);

結果圖

帶ALL關鍵字的子查詢

ALL關鍵字與ANY有點類似,只不過帶ALL關鍵字的子查詢返回的結果需同時滿足所有內層查詢條件。

--例:
SELECT*FROM department WHERE did>all(select did from employee);

結果圖

帶比較運算符的子查詢

前面的ANY和ALL關鍵字的子查詢中都使用了比較運算符,常見的有:>,<,>=,!=等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章