首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

SQL:1999 標準連接語法完整指南:CROSS/NATURAL/USING/ON/OUTER JOIN

     編輯:Oracle 教學

SQL:1999 標準連接語法完整指南

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 ...];

各類連接詳細說明與範例

1. 交叉連接 — 產生笛卡爾積

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;

2. 自然連接 — 自動匹配同名欄位

SELECT * FROM emp NATURAL JOIN dept;
-- 自動以 deptno 連接,結果不含重複的 deptno 欄位

注意:若表有多個同名欄位(如 created_by、updated_at),自然連接會全部匹配,易產生非預期結果,生產環境慎用。

3. USING 子句 — 指定連接欄位

SELECT * FROM emp JOIN dept USING (deptno);
-- 欄位名稱必須完全相同,結果僅保留一個 deptno 欄位

優點:語意明確、避免自然連接的多欄位誤匹配、結果欄位不重複。

4. ON 子句 — 完整連接條件

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);

最靈活、最推薦的內連接寫法。

5. 外連接 — LEFT/RIGHT/FULL OUTER JOIN

類型語法語意
左外連接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);

舊語法 (+) vs 新語法對照表

舊語法新語法備註
WHERE a = b(+)LEFT JOIN b ON a = b左表為主
WHERE a(+) = bRIGHT JOIN b ON a = b右表為主
不支援FULL OUTER JOIN新語法獨有
不支援 OR/IN 複雜條件ON (條件1 OR 條件2)新語法無限制

最佳實務建議

  • 內連接優先使用 JOIN ... ON,條件與業務邏輯分離,可讀性最高
  • 連接欄位同名且唯一時,可用 USING 簡化
  • 外連接必須使用 ANSI 語法,避免 (+) 限制
  • 避免使用 NATURAL JOIN 及 CROSS JOIN(除非刻意要笛卡爾積)
  • 多表連接時,建議每個連接單獨一行,縮排對齊,便於維護
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved