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

SQL JOIN 連接類型速查:內連接與三種外連接的空值處理差異

     編輯:關於SqlServer

JOIN 類型語義與 NULL 處理對照表

設左表 R、右表 S,連接條件 R.key = S.key:

連接類型結果集組成無對應時的 NULL 來源Venn 圖示意
INNER JOIN
(內連接)
僅保留 雙方皆符合條件 的列組合 無 NULL 補充 (不匹配列直接捨棄) R ∩ S (交集)
LEFT OUTER JOIN
(左外連接)
內連接結果 + 左表 R 中無匹配的列 右表 S 所有欄位為 NULL R 全集 (左圓完整)
RIGHT OUTER JOIN
(右外連接)
內連接結果 + 右表 S 中無匹配的列 左表 R 所有欄位為 NULL S 全集 (右圓完整)
FULL OUTER JOIN
(完整外連接)
內連接結果 + R 無匹配列 + S 無匹配列 雙向補 NULL:R 無匹配時 S 列為 NULL;S 無匹配時 R 列為 NULL R ∪ S (並集)

關鍵觀念

  • 外連接的本質:保留「主表」 (Left/Right/FULL 指定) 的所有列,缺乏匹配時以 NULL 填充從表欄位。
  • WHERE 子句陷阱:在 WHERE 中對從表欄位判斷 IS NOT NULL 或 = 'value',會隱性將 OUTER JOIN 轉為 INNER JOIN (因 NULL 不通過比較)。
    正確做法:將條件移至 ON 子句:LEFT JOIN S ON R.key = S.key AND S.status = 'Active'。
  • NULL 語意:外連接產生的 NULL 代表「不存在匹配」,而非資料本身為 NULL。查詢時需用 IS NULL 判斷,而非 = NULL。

舊版語法 (已棄用,勿用於新開發)

-- SQL Server 舊式外連接 (*=, =*)
SELECT * FROM R, S WHERE R.key *= S.key  -- LEFT JOIN
SELECT * FROM R, S WHERE R.key =* S.key  -- RIGHT JOIN

ANSI SQL-92 標準語法 (LEFT JOIN ... ON) 可攜性強、語意清晰、支援複雜條件,請全面採用。

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