外鍵是副表中引用主表主鍵的欄位。例如:學生表 classid 參考班級表 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)
);
作用: 副表插入資料時外鍵值必須存在於主表;刪除主表資料前需先處理副表關聯資料。
-- 級聯更新:主表主鍵變更,副表外鍵自動同步
CONSTRAINT student_class_fk FOREIGN KEY (classid) REFERENCES class(cid) ON UPDATE CASCADE
-- 級聯刪除:刪除主表資料,副表關聯資料自動刪除
CONSTRAINT student_class_fk FOREIGN KEY (classid) REFERENCES class(cid) ON DELETE CASCADE
產生笛卡爾積(表1行數 × 表2行數),通常非預期結果。
SELECT sid, cid FROM student, class;
僅返回符合條件的匹配行(不含 NULL)。
-- 隱式內連接
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 ON s.classid = c.cid;
以左表為基準,右表無匹配顯示 NULL。
SELECT s.sname, c.cid
FROM student s
LEFT JOIN class c ON s.classid = c.cid;
以右表為基準,左表無匹配顯示 NULL。
SELECT s.sname, c.cid
FROM class c
RIGHT JOIN student s ON s.classid = c.cid;
同一張表用別名關聯自身,如員工表查詢上下級關係。
SELECT e.ename AS 員工, b.ename AS 上司
FROM employee e
LEFT JOIN employee b ON e.bossId = b.eid;