CREATE TABLE emp (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(10)
);
CREATE TABLE emp_dept (
dept_id VARCHAR(4) NOT NULL,
emp_id INT NOT NULL,
emp_name VARCHAR(10),
PRIMARY KEY (dept_id, emp_id)
);
INSERT INTO emp VALUES
(1,'Dennis-1'),(2,'Dennis-2'),(3,'Dennis-3'),(4,'Dennis-4'),(5,'Dennis-5'),
(6,'Dennis-6'),(7,'Dennis-7'),(8,'Dennis-8'),(9,'Dennis-9'),(10,'Dennis-10');
INSERT INTO emp_dept VALUES
('R&D',1,'Dennis-1'),('Dev',2,'Dennis-2'),('R&D',3,'Dennis-3'),
('Test',4,'Dennis-4'),('Test',5,'Dennis-5');
SELECT a.id, a.name, b.dept_id
FROM emp a LEFT JOIN emp_dept b ON (a.id = b.emp_id);
結果: 10 筆資料,emp 中 6-10 號員工無部門資料顯示 NULL。
應用: 查詢 emp 有但 emp_dept 沒有的員工:
SELECT a.id, a.name, b.dept_id
FROM emp a LEFT JOIN emp_dept b ON (a.id = b.emp_id)
WHERE b.dept_id IS NULL;
SELECT a.id, a.name, b.dept_id
FROM emp a RIGHT JOIN emp_dept b ON (a.id = b.emp_id);
結果: 僅 5 筆,以 emp_dept 為基準,emp 中多出的 6-10 號不顯示。
交換表位置:FROM emp_dept b RIGHT JOIN emp a 結果與 LEFT JOIN 相同。
SELECT a.id, a.name, b.dept_id
FROM emp a, emp_dept b
WHERE a.id = b.emp_id;
結果: 僅 5 筆雙方都有資料的記錄,等同於 INNER JOIN。
| Join 類型 | 基準表 | 結果筆數 | 適用場景 |
|---|---|---|---|
| LEFT JOIN | 左表 | 左表全筆 | 主表完整保留,輔表可能無資料 |
| RIGHT JOIN | 右表 | 右表全筆 | 同上,習慣用 LEFT JOIN 統一 |
| INNER JOIN | 雙方匹配 | 交集 | 只需雙方都存在的資料 |
實務上建議統一使用 LEFT JOIN,以「主表在左」原則編寫,提升可讀性。