| 類型 | 關鍵字 | 結果集包含 | 典型用途 |
|---|---|---|---|
| 內部聯結 | INNER JOIN / JOIN | 雙方皆符合條件的列 | 主流業務查詢,只需匹配資料 |
| 交叉聯結 | CROSS JOIN | 笛卡兒積 (所有組合) | 產生測試資料、矩陣運算 |
| 左外部聯結 | LEFT OUTER JOIN | 左表全列 + 右表匹配列 (無則 NULL) | 主表帶從表,保留主表所有列 |
| 右外部聯結 | RIGHT OUTER JOIN | 右表全列 + 左表匹配列 (無則 NULL) | 較少用,可改寫為 LEFT JOIN |
| 完整外部聯結 | FULL OUTER JOIN | 雙方全列,無匹配處填 NULL | 雙向保留,如對帳比對 |
T_Customer (FId, FName, FAge)
T_Order (FId, FNumber, FPrice, FCustomerId)
T_OrderType(FId, FTypeName)
-- 兩表聯結
SELECT o.FId, o.FNumber, o.FPrice, c.FId, c.FName, c.FAge
FROM T_Order o
JOIN T_Customer c ON o.FCustomerId = c.FId;
-- 三表聯結 (訂單 + 客戶 + 訂單類型)
SELECT o.FId, o.FNumber, o.FPrice, c.FName, ot.FTypeName
FROM T_Order o
JOIN T_Customer c ON o.FCustomerId = c.FId
INNER JOIN T_OrderType ot ON o.FTypeId = ot.FId;
INNER為選擇性關鍵字,JOIN預設即為內部聯結。
SELECT c.FId, c.FName, c.FAge, o.FId, o.FNumber, o.FPrice
FROM T_Customer c, T_Order o;
SELECT c.FId, c.FName, c.FAge, o.FId, o.FNumber, o.FPrice
FROM T_Customer c
CROSS JOIN T_Order o;
結果筆數 = 左表列數 × 右表列數。大表慎用,極易造成效能災難。
SELECT o.FNumber, o.FPrice, o.FCustomerId, c.FName, c.FAge
FROM T_Order o
LEFT OUTER JOIN T_Customer c ON o.FCustomerId = c.FId;
說明:以 T_Order 為主體,所有訂單皆保留;找不到客戶時 FName/FAge 為 NULL。
SELECT o.FNumber, o.FPrice, o.FCustomerId, c.FName, c.FAge
FROM T_Order o
LEFT OUTER JOIN T_Customer c ON o.FCustomerId = c.FId
WHERE o.FPrice >= 150; -- 過濾主表條件,不影響外部聯結語意
SELECT o.FNumber, o.FPrice, o.FCustomerId, c.FName, c.FAge
FROM T_Order o
RIGHT OUTER JOIN T_Customer c ON o.FCustomerId = c.FId;
以 T_Customer 為主體,所有客戶皆保留;無訂單時訂單欄位為 NULL。建議統一改寫為 LEFT JOIN (交換表順序),提高可讀性。
SELECT o.FNumber, o.FPrice, o.FCustomerId, c.FName, c.FAge
FROM T_Order o
FULL OUTER JOIN T_Customer c ON o.FCustomerId = c.FId;
等價於 LEFT JOIN UNION RIGHT JOIN:
SELECT ... FROM T_Order o LEFT OUTER JOIN T_Customer c ON ...
UNION
SELECT ... FROM T_Order o RIGHT OUTER JOIN T_Customer c ON ...;
SQL Server 依 FROM 子句順序左至右評估聯結,必要時用括號明確分組:
SELECT ...
FROM (T_A a JOIN T_B b ON a.id = b.a_id)
LEFT JOIN T_C c ON b.id = c.b_id;
WHERE 過濾,再聯結。ON 條件對欄位使用函數 (導致索引失效)。SELECT * 傳輸無用資料。