ANSI SQL:1999 定義了標準化的連接語法,取代廠商專屬的 (+) 語法,提供更清晰的語意與跨資料庫可移植性。
SELECT [DISTINCT] * | 欄位 [AS] 別名, ...
FROM 表1 [別名1]
[CROSS JOIN 表2 別名2]
| [NATURAL JOIN 表2 別名2]
| [JOIN 表2 別名2 USING (關聯欄位)]
| [JOIN 表2 別名2 ON (關聯條件)]
| [LEFT | RIGHT | FULL OUTER JOIN 表2 ON (關聯條件)]
[WHERE 條件]
[ORDER BY ...];
SELECT * FROM emp e CROSS JOIN dept d;
-- 等同於舊語法: SELECT * FROM emp, dept;
-- 可加 WHERE 消除笛卡爾積
SELECT * FROM emp e CROSS JOIN dept d WHERE e.deptno = d.deptno;
SELECT * FROM emp NATURAL JOIN dept;
-- 自動以 deptno 連接,結果不含重複的 deptno 欄位
注意:若表有多個同名欄位(如 created_by、updated_at),自然連接會全部匹配,易產生非預期結果,生產環境慎用。
SELECT * FROM emp JOIN dept USING (deptno);
-- 欄位名稱必須完全相同,結果僅保留一個 deptno 欄位
優點:語意明確、避免自然連接的多欄位誤匹配、結果欄位不重複。
SELECT * FROM emp e JOIN dept d ON (e.deptno = d.deptno);
-- 支援任意條件表達式、不同欄位名、複合條件
SELECT * FROM emp e JOIN dept d ON (e.deptno = d.deptno AND e.sal > 1000);
最靈活、最推薦的內連接寫法。
| 類型 | 語法 | 語意 |
|---|---|---|
| 左外連接 | LEFT OUTER JOIN 表2 ON ... | 保留左表所有行,右表無匹配則 NULL |
| 右外連接 | RIGHT OUTER JOIN 表2 ON ... | 保留右表所有行,左表無匹配則 NULL |
| 全外連接 | FULL OUTER JOIN 表2 ON ... | 保留兩表所有行,無匹配雙邊填 NULL |
支援 ON 或 USING 指定條件:
-- 左外連接 + ON
SELECT * FROM emp e LEFT OUTER JOIN dept d ON (e.deptno = d.deptno);
-- 右外連接 + USING
SELECT * FROM emp e RIGHT OUTER JOIN dept d USING (deptno);
-- 全外連接
SELECT * FROM emp e FULL OUTER JOIN dept d ON (e.deptno = d.deptno);
| 舊語法 | 新語法 | 備註 |
|---|---|---|
WHERE a = b(+) | LEFT JOIN b ON a = b | 左表為主 |
WHERE a(+) = b | RIGHT JOIN b ON a = b | 右表為主 |
| 不支援 | FULL OUTER JOIN | 新語法獨有 |
| 不支援 OR/IN 複雜條件 | ON (條件1 OR 條件2) | 新語法無限制 |
JOIN ... ON,條件與業務邏輯分離,可讀性最高USING 簡化(+) 限制NATURAL JOIN 及 CROSS JOIN(除非刻意要笛卡爾積)