現代業務系統中,資料分散於多張表,透過主鍵/外鍵關聯。掌握各類 JOIN 操作,是高效查詢的關鍵。本文系統總結 MySQL 支援的聯接類型與實戰技巧。
每次聯接僅發生在兩張表之間,遵循三步邏輯:
多表聯接時,每次產生一個虛擬表,再與下一張表重複上述步驟。
CREATE DATABASE TestDB;
USE TestDB;
CREATE TABLE table1 (
customer_id VARCHAR(10) NOT NULL,
city VARCHAR(10) NOT NULL,
PRIMARY KEY(customer_id)
) ENGINE=INNODB DEFAULT CHARSET=UTF8;
CREATE TABLE table2 (
order_id INT NOT NULL AUTO_INCREMENT,
customer_id VARCHAR(10),
PRIMARY KEY(order_id)
) ENGINE=INNODB DEFAULT CHARSET=UTF8;
INSERT INTO table1 VALUES ('163','hangzhou'),('9you','shanghai'),('tx','hangzhou'),('baidu','hangzhou');
INSERT INTO table2 (customer_id) VALUES ('163'),('163'),('9you'),('9you'),('9you'),('tx');
執行笛卡爾積,左表 m 行 × 右表 n 行 = m×n 行結果。無 ON 條件,常用於生成大量測試資料。
SELECT * FROM table1 CROSS JOIN table2;
依據 ON/USING 條件匹配,僅返回符合條件的行。執行前兩步邏輯,不添加外部行。可省略 INNER 關鍵字,直接用 JOIN。
SELECT * FROM table1 INNER JOIN table2 ON table1.customer_id = table2.customer_id; -- 簡寫:同名欄位可用 USING SELECT * FROM table1 JOIN table2 USING (customer_id);
結果 = INNER JOIN 結果 + 外部行。必須指定 ON/USING。MySQL 支援 LEFT/RIGHT OUTER JOIN,可省略 OUTER。
SELECT * FROM table1 LEFT JOIN table2 USING (customer_id); SELECT * FROM table1 RIGHT JOIN table2 USING (customer_id);
等同於 INNER/OUTER JOIN + USING,自動匹配同名欄位。
SELECT * FROM table1 NATURAL JOIN table2; SELECT * FROM table1 NATURAL LEFT JOIN table2;
非新聯接類型,而是強制優化器先讀取左表。適合大表驅動小表或已知最佳訪問順序時優化效能。
EXPLAIN SELECT * FROM table1 STRAIGHT_JOIN table2 ON table1.customer_id = table2.customer_id;
熟練掌握各類 JOIN 的語義、執行邏輯與適用場景,配合 EXPLAIN 分析執行計畫,能寫出高效、可維護的多表查詢。