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

SQL Server JOIN 完整指南:內聯接、外聯接與交叉聯接詳解

     編輯:關於SqlServer

聯接類型總覽

SQL-92 標準語法(建議使用)

-- 左外聯接
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors a LEFT OUTER JOIN publishers p
    ON a.city = p.city
ORDER BY p.pub_name, a.au_lname, a.au_fname

舊式 *= / =* 語法易產生歧義,已不建議使用。

各類聯接行為圖解(以 pubs 資料庫為例)

左外聯接:保留所有作者

結果包含 23 筆,多數作者無對應出版社 → pub_name 為 NULL。僅 Abraham Bennet、Cheryl Carson 有匹配值。

右外聯接:保留所有出版社

結果 9 筆,包含無作者駐留城市的出版社(Binnet & Hardley 等),作者欄位為 NULL。

完整外聯接:保留兩邊所有資料

結果 30 筆 = 23 作者 + 9 出版社 - 2 重疊匹配。雙向 NULL 完整保留。

帶述詞的外聯接

SELECT s.stor_id, s.qty, t.title
FROM sales s RIGHT OUTER JOIN titles t
    ON s.title_id = t.title_id AND s.qty > 50
ORDER BY s.stor_id

銷售量 ≤ 50 或無銷售記錄的書名仍保留,stor_id/qty 為 NULL。

效能與最佳實務

  • 優先使用 內聯接,最佳化器最易產生高效計畫
  • 外聯接順序影響結果:A LEFT JOIN B ≠ B LEFT JOIN A
  • 將篩選條件放入 ON 而非 WHERE,避免外聯接退化為內聯接
  • 大表驅動小表時,考慮改寫為 EXISTS 或 IN
  • 避免不必要的 FULL JOIN,資料量大時極耗資源

常見錯誤

  • 外聯接後在 WHERE 針對右表欄位加條件(如 WHERE p.pub_name IS NOT NULL),導致外聯接失效
  • 混用舊新語法造成邏輯錯誤
  • 忘記 ON 條件導致交叉聯接

掌握各聯接語意與適用場景,是撰寫高效、正確 SQL 的基礎功力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類型關鍵字回傳行為
內聯接INNER JOIN / JOIN僅回傳雙方符合條件的行
左外聯接LEFT [OUTER] JOIN左表所有行 + 右表匹配行(無匹配則 NULL)
右外聯接RIGHT [OUTER] JOIN右表所有行 + 左表匹配行(無匹配則 NULL)
完整外聯接FULL [OUTER] JOIN雙表所有行,無匹配處填 NULL
交叉聯接CROSS JOIN笛卡兒積,無 ON 條件