SQL 連接查詢是關聯式資料庫核心技能。以經典 `emp`(14 筆)、`dept`(4 筆)、`salgrade`(5 筆)範例資料為基礎,詳細解析交叉連接、內連接、外連接(左/右/完整)、自連接的語法、語意差異與結果集特徵。

無 `ON` 條件,回傳兩表笛卡兒積。顯式與隱式語法結果相同(14 × 4 = 56 筆)。
-- 隱式
SELECT empno, ename, sal, dname, loc FROM emp, dept;
-- 顯式 (ANSI SQL:1999)
SELECT empno, ename, sal, dname, loc FROM emp CROSS JOIN dept;
用途:生成測試資料組合、全排列矩陣;實務極少直接使用。
依 `ON`/`WHERE` 條件比對,僅回傳符合條件的資料列。最常用、效能最佳。
-- ANSI 92 (舊式)
SELECT e.empno, e.ename, e.sal, d.dname, d.loc
FROM emp e, dept d
WHERE e.deptno = d.deptno;
-- ANSI 99 (推薦)
SELECT e.empno, e.ename, e.sal, d.dname, d.loc
FROM emp e INNER JOIN dept d ON e.deptno = d.deptno;
結果:14 筆(每位員工對應其部門)。若員工 `deptno` 為 NULL 或部門表無對應部門,該列不會出現。
保留左表所有列,右表無對應則填 NULL。
SELECT e.empno, e.ename, d.dname
FROM emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno;
若有員工無部門,`dname` 顯示 NULL。
保留右表所有列,左表無對應則填 NULL。
SELECT e.empno, e.ename, d.dname
FROM emp e RIGHT OUTER JOIN dept d ON e.deptno = d.deptno;
若有部門無員工,`empno/ename` 顯示 NULL。
左右表皆保留,無對應處填 NULL(Oracle 支援 `FULL OUTER JOIN`)。
SELECT e.empno, e.ename, d.dname
FROM emp e FULL OUTER JOIN dept d ON e.deptno = d.deptno;
同一資料表自我連接,需使用別名區分角色。經典案例:查詢員工及其主管姓名。
SELECT e.ename AS 員工, m.ename AS 主管
FROM emp e LEFT JOIN emp m ON e.mgr = m.empno;
KING 為社長無主管,左連接保留其列,主管欄位為 NULL。
連接條件為範圍比較而非等號。例:依薪資等級表 `salgrade` 判定員工薪資等級。
SELECT e.ename, e.sal, s.grade
FROM emp e JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;
掌握上述連接類型與寫法,配合 `EXPLAIN PLAN` 分析執行計畫,即能應對多數實務報表與商業智慧查詢需求。