FROM A JOIN B ON A.id = B.id — 標準 SQL-92 語法,可讀性佳、支援所有 JOIN 類型。FROM A, B WHERE A.id = B.id — 舊式語法,**僅支援內聯接**,易誤產生笛卡爾積。回傳雙方都符合關聯條件的資料列。等值聯接 (=) 最常見,亦可用非等值 (<, >, <=, >=, <>)。
SELECT A.col1, B.col2
FROM TableA A
[INNER] JOIN TableB B ON A.key = B.key;
INNER 關鍵字可省略。
回傳左表所有列,右表無對應者以 NULL 填補。
SELECT A.col1, B.col2
FROM TableA A
LEFT [OUTER] JOIN TableB B ON A.key = B.key;
左外聯接鏡像,回傳右表所有列,左表無對應者為 NULL。實務建議改寫為左外聯接並交換表順序。
回傳雙表所有列,無對應處雙邊以 NULL 填補。等同 LEFT JOIN UNION RIGHT JOIN 去重。
產生笛卡爾積:左表每列 × 右表每列。無 ON 子句。極少業務直接使用,主要用於測試資料生成、矩陣運算。
SELECT * FROM TableA CROSS JOIN TableB;
-- 若 TableA 3 列、TableB 4 列 → 12 列結果
INNER JOIN ≤ MIN(左表行數, 右表行數) LEFT JOIN = 左表行數 RIGHT JOIN = 右表行數 FULL JOIN ≤ 左表行數 + 右表行數 CROSS JOIN = 左表行數 × 右表行數
-- 需求:所有客戶及其 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,其餘類型視具體需求選用。