1.外鍵約束
一個表中的非主鍵字段,如果在另外一張表中是主鍵,那麼這個字段我們叫它做外鍵。
例如,現在有兩個表:
學生表 - 學號,姓名,性別,所在班級號
班級表 - 班級號,班級人數
在學生表中,學號是主鍵;在班級表中,班級號是主鍵,而學生表中‘所在班級號’是非主鍵。所以,所在班級號對學生表來說是一個外鍵。
語句:CONSTRAINT student_class_fk FOREIGN KEY (classid) REFERENCES class(cid)
外鍵的名字 副表屬性 綁定 主表屬性
先創建主表:
CREATE TABLE class(
cid INT PRIMARY KEY,
ccount INT
);
然後創建副表來加入外鍵:
CREATE TABLE student(
sid INT PRIMARY KEY,
sname VARCHAR(20),
sex VARCHAR(4),
classid INT,
CONSTRAINT student_class_fk FOREIGN KEY (classid) REFERENCES class(cid)
);
外鍵的作用:
往副表插入數據,數據中外鍵的值在主表必須存在。
刪除主表的主鍵某個數據之前,先要把副表中依賴那個數據的外鍵值改變,才能順利刪除。
2.級聯操作
如果想要在主表把主鍵的值改變,然後副表外鍵的值跟著改變,那麼就要需要級聯操作。
2.1級聯更新
CONSTRAINT student_class_fk FOREIGN KEY (classid) REFERENCES class(cid) ON UPDATE CASCADE -- 級聯更新(更新主表數據,副表會跟著改變)
2.2級聯刪除
CONSTRAINT student_class_fk FOREIGN KEY (classid) REFERENCES class(cid) ON DELETE CASCADE -- 級聯刪除(刪除主表數據,副表會跟著刪除)
3.多表查詢
3.1 交叉查詢
-- 2.1 交叉查詢(產生笛卡爾積: 表1的總記錄 * 表2的總記錄) (不希望出現)
SELECT sid,cid FROM student,class;
3.2 內連接
-- 2.2 內連接查詢(使用最頻繁)
-- 特點: 要在滿足表條件的前提的數據才顯示出來(不包括null值)
-- 多表查詢的思路: 1) 確定有哪些表 2)確定查詢出哪些字段 3)確定表和表之間的關系(條件數據: n-1)
-- 需求: 查詢1班學生的姓名和1班的人數
SELECT s.sname,c.ccount -- 哪些字段
FROM student s,class c -- 哪些表
WHERE s.classid=c.cid; -- 表的條件
SELECT s.sname,c.ccount
FROM student s
INNER JOIN class c -- inner join : 內連接查詢
ON s.classid=c.cid;
3.3 左外連接
-- 2.3 左外連接
-- 需求: 查詢哪個班有哪些學生
-- 左外連接查詢: 用左邊的表數據去匹配右邊的表數據,右邊表數據如果匹配成功,則顯示記錄,如果匹配不成功,則顯示null
SELECT s.sname,c.cid
FROM s.sname
LEFT OUTER JOIN class c
ON s.classid=c.cid;
3.4 右外連接
-- 2.4 右外連接: 和左外連接相反
-- 右外連接查詢: 用右邊的表數據去匹配左邊的表數據,左邊表數據如果匹配成功,則顯示記錄,如果匹配不成功,則顯示null
SELECT s.sname,c.cid
FROM class c
RIGHT OUTER JOIN s.sname
ON s.classid=c.cid;
3.5 自連接
-- 2.5 自連接(當前表連接當前表)
自連接就是把同一張表虛擬出兩份一模一樣的表,然後起一個別名,然後連接兩張表來查詢。
SELECT e.ename,b.ename
FROM employee e -- 員工表
LEFT OUTER JOIN employee b -- 上司表
ON e.boosId=b.eid;
學習之所以會想睡覺,是因為那是夢開始的地方。