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

SQL 多表聯結查詢完整指南:INNER / CROSS / LEFT / RIGHT / FULL OUTER JOIN

     編輯:關於SqlServer

聯結類型總覽

類型關鍵字結果集包含典型用途
內部聯結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)

1. 內部聯結 (INNER JOIN)


-- 兩表聯結
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 預設即為內部聯結。

2. 交叉聯結 (CROSS JOIN)

隱式語法 (舊式)


SELECT c.FId, c.FName, c.FAge, o.FId, o.FNumber, o.FPrice
FROM T_Customer c, T_Order o;

顯式語法 (ANSI SQL-92)


SELECT c.FId, c.FName, c.FAge, o.FId, o.FNumber, o.FPrice
FROM T_Customer c
CROSS JOIN T_Order o;

結果筆數 = 左表列數 × 右表列數。大表慎用,極易造成效能災難。

3. 左外部聯結 (LEFT OUTER JOIN)


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。

搭配 WHERE 過濾


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;  -- 過濾主表條件,不影響外部聯結語意

4. 右外部聯結 (RIGHT OUTER JOIN)


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 (交換表順序),提高可讀性。

5. 完整外部聯結 (FULL OUTER 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;

效能優化檢查清單

  1. 聯結欄位建立索引 (FK 欄位、PK 欄位)。
  2. 優先縮小結果集:先在單表用 WHERE 過濾,再聯結。
  3. 避免在 ON 條件對欄位使用函數 (導致索引失效)。
  4. 大表聯結觀察執行計畫:Hash Match vs Nested Loops vs Merge Join,必要時用 Hint 引導。
  5. 只選需要欄位,避免 SELECT * 傳輸無用資料。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved