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

SQL Server 外部聯結完整指南:LEFT、RIGHT、FULL JOIN 與範例解析

     編輯:關於SqlServer

外部聯結類型

外部聯結保留至少一方資料表的所有列,即使在另一方無匹配行。SQL-92 標準關鍵字:

  • LEFT [OUTER] JOIN:保留左表所有列
  • RIGHT [OUTER] JOIN:保留右表所有列
  • FULL [OUTER] JOIN:保留兩表所有列

舊式 *=/=* 語法易產生歧義,**強烈建議使用 SQL-92 語法**。

範例資料:authors(作者)與 publishers(出版社)

兩表透過 city 城市欄位聯結。只有 Abraham Bennet、Cheryl Carson 兩位作者與出版社位於同一城市 (Algodata Infosystems)。

1. LEFT OUTER JOIN:保留所有作者

USE pubs;
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;

結果:23 列。兩位匹配作者顯示出版社名,其餘 21 位作者 pub_name 為 NULL。

2. RIGHT OUTER JOIN:保留所有出版社

SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors a
RIGHT OUTER JOIN publishers p ON a.city = p.city
ORDER BY p.pub_name, a.au_lname, a.au_fname;

結果:9 列。兩位匹配作者顯示,其餘 7 家出版社無對應作者,作者欄位為 NULL。

3. FULL OUTER JOIN:保留雙方所有列

SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors a
FULL OUTER JOIN publishers p ON a.city = p.city
ORDER BY p.pub_name, a.au_lname, a.au_fname;

結果:30 列。包含所有作者(23)+ 所有出版社(9)− 匹配的 2 列 = 30 列。雙方無匹配處均為 NULL。

進階:在 ON 子句中加入篩選條件

外部聯結的 ON 子句可加入常數比較,進一步限制結果:

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 的才顯示銷售明細,其餘銷售欄位為 NULL。若將條件移至 WHERE,則會過濾掉無銷售記錄的書名,變成內部聯結效果。

內部聯結 vs 外部聯結

  • 內部聯結:僅傳回雙方均有匹配的列。
  • 外部聯結:傳回指定保留方的所有列,無匹配處以 NULL 填補。

最佳實踐

  • 永遠使用 LEFT/RIGHT/FULL OUTER JOIN 明確語法。
  • 篩選條件放在 ON(保留外部列語意)或 WHERE(轉為內部聯結語意)要深思熟慮。
  • 使用表別名簡化查詢,提升可讀性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved