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

Oracle JOIN 語法全解析:從 8i 到 9i/10g 的內外連接寫法演進

     編輯:Oracle 資料庫基礎

前言

Oracle 多表連接查詢是 SQL 核心技能。本文系統梳理 Oracle 8i 專有語法((+))與 ANSI SQL:1999 標準語法(INNER/LEFT/RIGHT/FULL JOIN)的對應關係,並通過實例詳細演示各類連接的結果差異。

測試數據準備

CREATE TABLE test1 (a INT, b INT);
CREATE TABLE test2 (a INT, b INT);
INSERT INTO test1 VALUES (1, 456);
INSERT INTO test1 VALUES (2, 427);
INSERT INTO test2 VALUES (1, 45456);
INSERT INTO test2 VALUES (3, 45656);

表 A(test1)與表 B(test2)僅在 a=1 時匹配。

Oracle 8i 專有語法((+) 表示外連接)

連接類型語法結果說明
內連接SELECT * FROM test1 a, test2 b WHERE a.a = b.a;僅返回匹配行(a=1)
左連接SELECT * FROM test1 a, test2 b WHERE a.a = b.a(+);返回 test1 所有行,test2 無匹配則為 NULL
右連接SELECT * FROM test1 a, test2 b WHERE a.a(+) = b.a;返回 test2 所有行,test1 無匹配則為 NULL
全連接SELECT * FROM test1 a, test2 b WHERE a.a = b.a(+) UNION SELECT * FROM test1 a, test2 b WHERE a.a(+) = b.a;8i 無直接語法,需 UNION 實現
笛卡爾積SELECT * FROM test1, test2;無連接條件,行數相乘

9i/10g/11g+ 標準 ANSI JOIN 語法(推薦)

-- 內連接
SELECT * FROM A INNER JOIN B ON A.ID = B.ID;

-- 左外連接
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID;
-- 等同於 LEFT OUTER JOIN

-- 右外連接
SELECT * FROM A RIGHT JOIN B ON A.ID = B.ID;

-- 全外連接
SELECT * FROM A FULL OUTER JOIN B ON A.ID = B.ID;

實例結果對照(表 A: ID/NAME | 表 B: ID/CLASS)

A.IDA.NAMEB.IDB.CLASS
1IBM1C1
2SONY3C3
3BMW4C4

INNER JOIN

ID  NAME  CLASS
1   IBM   C1
3   BMW   C3

僅返回雙方都存在的匹配行。

LEFT JOIN

ID  NAME  CLASS
1   IBM   C1
2   SONY  NULL
3   BMW   C3

保留左表(A)所有行,右表無匹配填 NULL。

RIGHT JOIN

ID  NAME  CLASS
1   IBM   C1
3   BMW   C3
4   NULL  C4

保留右表(B)所有行,左表無匹配填 NULL。

FULL OUTER JOIN

ID  NAME  CLASS
1   IBM   C1
2   SONY  NULL
3   BMW   C3
4   NULL  C4

雙邊全保留,無匹配處填 NULL。

最佳實踐建議

  1. 優先使用 ANSI 標準語法:可讀性強、可移植、支持 FULL JOIN、多表連接語義清晰。
  2. 避免混用:同一條 SQL 中不要混用 (+) 和 JOIN ... ON。
  3. 外連接條件放在 ON 子句:LEFT JOIN B ON A.ID = B.ID AND B.TYPE = 'X',而非 WHERE,否則退化為內連接。
  4. 性能等價:現代優化器對兩種語法生成相同執行計劃。

總結

掌握從 (+) 到標準 JOIN 的演進,不僅能讀懂舊代碼,更能編寫清晰、可維護的現代 SQL。建議新項目全面採用 ANSI JOIN 語法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved