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

Oracle 連接查詢完全指南:LEFT JOIN、RIGHT JOIN、FULL JOIN 與舊式外連接語法對照

     編輯:Oracle 資料庫基礎

Oracle 支援 ANSI SQL:1999 標準的 LEFT JOIN、RIGHT JOIN、FULL JOIN,並保留舊式 (+) 外連接語法。本文以 DUAL 表為例,展示三種標準外連接與舊式語法的對應關係與結果差異,助開發者精準掌握資料集合邏輯。

三大標準外連接語義

連接類型結果集包含
LEFT JOIN左表所有列 + 右表匹配列(無匹配則 NULL)
RIGHT JOIN右表所有列 + 左表匹配列(無匹配則 NULL)
FULL JOIN左表所有列 + 右表所有列(雙向無匹配均為 NULL)

實戰範例:DUAL 表自連接演示

建立兩個邏輯表別名 LEFT_、RIGHT_,連接條件 LEFT_.DUMMY || 'd' = RIGHT_.DUMMY(故意不匹配以展示 NULL 填充)。

1. LEFT JOIN

SELECT
  NVL(LEFT_.DUMMY, '這是要右邊的全部')  AS LEFT_DUMMY,
  NVL(RIGHT_.DUMMY, '這是要左邊的全部')  AS RIGHT_DUMMY
FROM DUAL LEFT_ LEFT JOIN DUAL RIGHT_
  ON LEFT_.DUMMY || 'd' = RIGHT_.DUMMY;

結果:左表 DUAL 單行 'X' 保留,右表無匹配 → RIGHT_DUMMY 顯示預設字串。

2. RIGHT JOIN

SELECT
  NVL(LEFT_.DUMMY, '這是要右邊的全部')  AS LEFT_DUMMY,
  NVL(RIGHT_.DUMMY, '這是要左邊的全部')  AS RIGHT_DUMMY
FROM DUAL LEFT_ RIGHT JOIN DUAL RIGHT_
  ON LEFT_.DUMMY || 'd' = RIGHT_.DUMMY;

結果:右表 DUAL 單行 'X' 保留,左表無匹配 → LEFT_DUMMY 顯示預設字串。

3. 舊式外連接語法 (+) 對應 LEFT JOIN

SELECT
  NVL(LEFT_.DUMMY, '這是要右邊的全部')  AS LEFT_DUMMY,
  NVL(RIGHT_.DUMMY, '這是要左邊的全部')  AS RIGHT_DUMMY
FROM DUAL LEFT_, DUAL RIGHT_
WHERE LEFT_.DUMMY || 'd' = RIGHT_.DUMMY(+);
  • (+) 放在右表欄位 → 相當於 LEFT JOIN
  • (+) 放在左表欄位 → 相當於 RIGHT JOIN
  • 限制:(+) 不能用於 OR 條件、不能對同一表多欄位加 (+)、不支援 FULL JOIN

關鍵差異與最佳實踐

維度ANSI JOIN舊式 (+)
可讀性連接條件與過濾條件分離混雜在 WHERE 子句
FULL JOIN 支援原生支援不支援(需 UNION 兩邊 LEFT/RIGHT)
多表連接清晰的 ON 子句鏈易產生笛卡兒積或邏輯錯誤
相容性跨資料庫可移植Oracle 專有
建議新代碼全面使用 ANSI JOIN僅維護舊代碼時接觸

進階提示

  • NVL(col, default) 或 COALESCE(col1, col2, ...) 處理外連接產生的 NULL 顯示
  • 外連接後再加過濾條件需注意:WHERE right.col = 'value' 會隱性轉為內連接,應移至 ON 子句
  • Oracle 12c+ 支援 LATERAL / CROSS APPLY 進階連接模式

結語

掌握 LEFT/RIGHT/FULL JOIN 的集合語義,拋棄舊式 (+) 語法,是寫出可維護、可移植 SQL 的基礎。下次寫連接查詢時,先在腦中畫出文氏圖,再落鍵盤。

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