四大 JOIN 類型語法、語義、結果集差異一覽,附 Venn 圖邏輯與效能提示。
SELECT * FROM t1 INNER JOIN t2 ON t1.userid = t2.userid;
-- 等價舊寫法:SELECT * FROM t1, t2 WHERE t1.userid = t2.userid
語義:僅回傳兩表鍵值同時存在的行 (交集)。
效能:通常最優,優化器可自由調整驅動表順序。
SELECT * FROM t1 LEFT OUTER JOIN t2 ON t1.userid = t2.userid;
語義:保留 左表 (t1) 所有行,右表匹配行填入,無匹配則 NULL 填充。
應用:主表帶從表屬性 (如訂單+商品明細,保留無明細訂單)。
SELECT * FROM t1 RIGHT OUTER JOIN t2 ON t1.userid = t2.userid;
語義:保留 右表 (t2) 所有行,左表無匹配則 NULL。
等價:t1 RIGHT JOIN t2 ≡ t2 LEFT JOIN t1,建議統一用 LEFT JOIN 降低認知負荷。
SELECT * FROM t1 FULL OUTER JOIN t2 ON t1.userid = t2.userid;
語義:兩表所有行皆保留,匹配合併,無匹配雙邊 NULL 填充 (聯集)。
注意:MySQL 不支援FULL OUTER JOIN,需用 UNION 模擬:
SELECT * FROM t1 LEFT JOIN t2 ON t1.userid = t2.userid
UNION
SELECT * FROM t1 RIGHT JOIN t2 ON t1.userid = t2.userid;
INNER JOIN,結果集最小。