WHERE 子句中指定連接條件(舊式語法)。INNER JOIN ... ON 語法(ANSI SQL-92 標準),可讀性與維護性更佳。| 連接類型 | 口訣 | 結果集說明 | Venn 圖概念 |
|---|---|---|---|
INNER JOIN |
「有效連接」 | 僅返回 兩張表都符合 ON 條件 的資料列。 | A ∩ B(交集) |
LEFT JOIN |
「有左顯示」 | 返回 左表所有資料,右表符合條件的資料;右表無匹配則以 NULL 填充。 |
A 全集 + (A ∩ B) |
RIGHT JOIN |
「有右顯示」 | 返回 右表所有資料,左表符合條件的資料;左表無匹配則以 NULL 填充。 |
B 全集 + (A ∩ B) |
FULL JOIN |
「全連接」 | 返回 兩張表所有資料,無匹配側以 NULL 填充。MySQL 不直接支援,可用 LEFT JOIN UNION RIGHT JOIN 模擬。 |
A ∪ B(聯集) |
-- 內連接:只有雙方都有的訂單與客戶
SELECT o.id, c.name, o.amount
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id;
-- 左連接:所有客戶,含無訂單者
SELECT c.name, o.id, o.amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id;
-- 右連接:所有訂單,含無對應客戶者(罕用,可改 LEFT JOIN 交換表順序)
SELECT c.name, o.id, o.amount
FROM customers c
RIGHT JOIN orders o ON c.id = o.customer_id;
-- 全連接模擬:MySQL 不支援 FULL JOIN
SELECT c.name, o.id, o.amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
UNION
SELECT c.name, o.id, o.amount
FROM customers c
RIGHT JOIN orders o ON c.id = o.customer_id;
INNER JOIN,結果集最小,效能最好。LEFT JOIN 若右表無索引,會導致全表掃描,確保 ON 條件欄位有索引。ON 條件中使用函數或運算,導致索引失效。掌握 JOIN 語義與適用場景,能寫出正確且高效的關聯查詢,是 SQL 進階的關鍵技能。