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

SQL JOIN 類型完整說明:內聯接、外聯接 (左/右/完整)、交叉聯接

     編輯:關於SqlServer

JOIN 條件位置建議

  • ✅ FROM 子句:FROM A JOIN B ON A.id = B.id — 標準 SQL-92 語法,可讀性佳、支援所有 JOIN 類型。
  • ⚠️ WHERE 子句:FROM A, B WHERE A.id = B.id — 舊式語法,**僅支援內聯接**,易誤產生笛卡爾積。

五大 JOIN 類型定義與語法

1. 內聯接 (INNER JOIN)

回傳雙方都符合關聯條件的資料列。等值聯接 (=) 最常見,亦可用非等值 (<, >, <=, >=, <>)。

SELECT A.col1, B.col2
FROM TableA A
[INNER] JOIN TableB B ON A.key = B.key;

INNER 關鍵字可省略。

2. 左外聯接 (LEFT OUTER JOIN)

回傳左表所有列,右表無對應者以 NULL 填補。

SELECT A.col1, B.col2
FROM TableA A
LEFT [OUTER] JOIN TableB B ON A.key = B.key;

3. 右外聯接 (RIGHT OUTER JOIN)

左外聯接鏡像,回傳右表所有列,左表無對應者為 NULL。實務建議改寫為左外聯接並交換表順序。

4. 完整外聯接 (FULL OUTER JOIN)

回傳雙表所有列,無對應處雙邊以 NULL 填補。等同 LEFT JOIN UNION RIGHT JOIN 去重。

5. 交叉聯接 (CROSS JOIN)

產生笛卡爾積:左表每列 × 右表每列。無 ON 子句。極少業務直接使用,主要用於測試資料生成、矩陣運算。

SELECT * FROM TableA CROSS JOIN TableB;
-- 若 TableA 3 列、TableB 4 列 → 12 列結果

結果集行數關係

INNER JOIN  ≤  MIN(左表行數, 右表行數)
LEFT JOIN   =  左表行數
RIGHT JOIN  =  右表行數
FULL JOIN   ≤  左表行數 + 右表行數
CROSS JOIN  =  左表行數 × 右表行數

外聯接關鍵陷阱:ON vs WHERE

-- 需求:所有客戶及其 2023 年訂單
-- ✅ 正確:ON 篩選右表,左表保留
SELECT C.*, O.* FROM Customer C
LEFT JOIN Orders O ON C.id = O.cust_id AND O.order_date >= '2023-01-01';

-- ❌ 錯誤:WHERE 篩選右表欄位,外聯接退化為內聯接
SELECT C.*, O.* FROM Customer C
LEFT JOIN Orders O ON C.id = O.cust_id
WHERE O.order_date >= '2023-01-01';  -- 無訂單客戶被過濾掉

結語

掌握五大 JOIN 語意差異、ON/WHERE 放置規則、結果集行數關係,是撰寫正確高效 SQL 查詢的基石。實務中 90% 以上場景僅需 INNER JOIN 與 LEFT JOIN,其餘類型視具體需求選用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved