| 類型 | 關鍵字 | 回傳行為 |
| 內聯接 | INNER JOIN / JOIN | 僅回傳雙方符合條件的行 |
| 左外聯接 | LEFT [OUTER] JOIN | 左表所有行 + 右表匹配行(無匹配則 NULL) |
| 右外聯接 | RIGHT [OUTER] JOIN | 右表所有行 + 左表匹配行(無匹配則 NULL) |
| 完整外聯接 | FULL [OUTER] JOIN | 雙表所有行,無匹配處填 NULL |
| 交叉聯接 | CROSS JOIN | 笛卡兒積,無 ON 條件 |
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 的基礎功力。
- 上一篇文章: 樹狀結構在關聯式資料表中的儲存與遞迴統計查詢實作
- 下一篇文章: Microsoft SQL Server 2000 數據轉換服務 (DTS) 架構與應用場景
Copyright ©
程式碼之家 All Rights Reserved