在 DB2 數據庫開發中,表連接是多表查詢的基石。掌握 交叉連接(CROSS JOIN)、內連接(INNER JOIN) 以及 外連接(OUTER JOIN) 的差異與適用場景,能顯著提升 SQL 編寫效率與查詢效能。本文將系統梳理這三大連接類型的語法、行為特徵及最佳實踐。
交叉連接不帶 ON 子句,會返回兩張表所有行的組合,即笛卡爾積。若表 A 有 m 行、表 B 有 n 行,結果集將包含 m × n 行。DB2 支援顯式與隱式兩種寫法:
SELECT [cols_list]
FROM a CROSS JOIN b
WHERE [condition];
SELECT [cols_list]
FROM a, b
WHERE [condition];
注意: 除非確實需要全排列(如生成測試資料、報表矩陣),否則應避免在生產環境直接使用 CROSS JOIN,否則極易導致結果集暴增、效能惡化。
內連接返回同時滿足連接條件與查詢條件的資料行,是最常用的連接方式。同樣提供顯式與隱式兩種形式:
SELECT [cols_list]
FROM a INNER JOIN b ON [join_condition]
WHERE [filter_condition];
SELECT [cols_list]
FROM a, b
WHERE [join_condition] AND [filter_condition];
最佳實踐: 採用顯式 INNER JOIN ... ON 寫法,可將連接邏輯與過濾邏輯分離,提升可讀性並減少錯誤。
外連接不僅返回匹配行,還會根據類型保留單側或雙側不匹配的行。DB2 提供三種外連接,OUTER 關鍵字可省略:
| 類型 | 關鍵字 | 保留行規則 |
|---|---|---|
| 左外連接 | LEFT [OUTER] JOIN |
返回內連接結果 + 左表中不滿足連接條件但滿足查詢條件的行(右表欄位為 NULL) |
| 右外連接 | RIGHT [OUTER] JOIN |
返回內連接結果 + 右表中不滿足連接條件但滿足查詢條件的行(左表欄位為 NULL) |
| 全外連接 | FULL [OUTER] JOIN |
返回內連接結果 + 左表不匹配行 + 右表不匹配行(相當於 LEFT JOIN UNION RIGHT JOIN 去重) |
-- 左外連接
SELECT [cols_list]
FROM a LEFT JOIN b ON [condition]
WHERE [condition];
-- 多表混合連接
SELECT [cols_list]
FROM a
LEFT JOIN b ON [condition]
INNER JOIN c ON [condition]
WHERE [condition];
| 特性 | CROSS JOIN | INNER JOIN | LEFT/RIGHT/FULL JOIN |
|---|---|---|---|
| ON 子句 | 不支援 | 必須 | 必須 |
| 結果集大小 | m × n | ≤ min(m, n) | 介於 INNER 與 CROSS 之間 |
| 非匹配行處理 | 全部保留 | 全部捨棄 | 視類型保留單/雙側 |
| 典型場景 | 矩陣生成、測試資料 | 主外鍵關聯、維度查詢 | 報表補全、差異分析 |
b.col = 'X'),左外連接會退化為內連接;請將此類條件移至 ON 子句。LEFT JOIN UNION RIGHT JOIN 分步執行並去重。掌握上述連接類型的語義與適用邊界,能幫助你編寫出語義精確、效能優異的 DB2 SQL 語句。