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;
結果:emp 全部 10 列,emp_dept 無對應者顯示 NULL
| id | name | dept_id |
|---|---|---|
| 1 | Dennis-1 | R&D |
| 2 | Dennis-2 | Dev |
| 3 | Dennis-3 | R&D |
| 4 | Dennis-4 | Test |
| 5 | Dennis-5 | Test |
| 6 | Dennis-6 | NULL |
| 7 | Dennis-7 | NULL |
| 8 | Dennis-8 | NULL |
| 9 | Dennis-9 | NULL |
| 10 | Dennis-10 | NULL |
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;
結果:emp_dept 5 列,emp 無對應者不顯示(此例無此情況)
SELECT a.id, a.name, b.dept_id
FROM emp_dept b RIGHT JOIN emp a ON a.id = b.emp_id;
結果與第一個 LEFT JOIN 完全相同。
SELECT a.id, a.name, b.dept_id
FROM emp a INNER JOIN emp_dept b ON a.id = b.emp_id;
-- 舊式寫法
SELECT a.id, a.name, b.dept_id
FROM emp a, emp_dept b
WHERE a.id = b.emp_id;
結果:僅雙方都有的 5 列
SELECT e.name, d.dept_id, p.project_name
FROM emp e
LEFT JOIN emp_dept d ON e.id = d.emp_id
LEFT JOIN project p ON d.dept_id = p.dept_id;
善用別名(e、d、p)簡化 SQL、提升可讀性。