外部聯結保留至少一方資料表的所有列,即使在另一方無匹配行。SQL-92 標準關鍵字:
LEFT [OUTER] JOIN:保留左表所有列RIGHT [OUTER] JOIN:保留右表所有列FULL [OUTER] JOIN:保留兩表所有列舊式 *=/=* 語法易產生歧義,**強烈建議使用 SQL-92 語法**。
兩表透過 city 城市欄位聯結。只有 Abraham Bennet、Cheryl Carson 兩位作者與出版社位於同一城市 (Algodata Infosystems)。
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。
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。
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 子句可加入常數比較,進一步限制結果:
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,則會過濾掉無銷售記錄的書名,變成內部聯結效果。
NULL 填補。LEFT/RIGHT/FULL OUTER JOIN 明確語法。ON(保留外部列語意)或 WHERE(轉為內部聯結語意)要深思熟慮。