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

SQL JOIN 完全圖解:INNER、LEFT、RIGHT、FULL OUTER JOIN 差異與範例

     編輯:關於SqlServer

JOIN 類型速查

類型關鍵字結果集包含
內部聯結INNER JOIN雙方皆符合 ON 條件的列
左外部聯結LEFT [OUTER] JOIN左表所有列 + 右表匹配列 (無匹配則 NULL)
右外部聯結RIGHT [OUTER] JOIN右表所有列 + 左表匹配列 (無匹配則 NULL)
完整外部聯結FULL [OUTER] JOIN雙表所有列,無匹配處填 NULL

語法標準

SQL-92 標準關鍵字:LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN。舊式 *=, =* 易產生歧義,不建議使用。

範例資料

authors (作者) 與 publishers (出版社) 以 city 聯結。

LEFT OUTER JOIN:所有作者,無論出版社是否同城

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 列。未同城作者的 pub_name 為 NULL。

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 列。無同城作者的出版社顯示 au_fname/lname = 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

AND s.qty > 50 放在 ON 子句中,不影響右表保留;若放在 WHERE 會轉為內部聯結。

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。

實務建議

  • 預設用 INNER JOIN,明確需要保留單邊資料才用 OUTER JOIN。
  • 多表聯結時,將 OUTER JOIN 放在最後,避免語意混淆。
  • 檢查 NULL 來源:是資料缺失還是聯結不上,避免業務邏輯錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved