JOIN ... USING(column) 是 MySQL 提供的語法糖,專為「兩表連接列同名」的等值連接設計。本文解析其語法規則、多表鏈接用法、與 ON 的區別、適用邊界及最佳實踐。
-- USING 寫法
SELECT a.*, b.* FROM a LEFT JOIN b USING(colA);
-- 等價 ON 寫法
SELECT a.*, b.* FROM a LEFT JOIN b ON a.colA = b.colA;
關鍵要求:USING(colA) 指定的列必須在**兩個表中同名且同類型**。
SELECT a.*, b.*, c.*
FROM a
LEFT JOIN b USING(colA) -- colA 在 a、b 中存在
LEFT JOIN c USING(colB); -- colB 在 a、c 中存在(或 b、c 中存在,視連接順序)
⚠️ 陷阱:後續 USING 引用的列必須在**當前結果集與下一張表**中同時存在。實踐中建議顯式用 ON 避免歧義。
| 維度 | USING(column) | ON condition |
|---|---|---|
| 適用場景 | 連接列同名、等值連接 | 任意連接條件(異名、非等值、複合條件、函數) |
| 結果集列去重 | 是:連接列在結果集中**僅出現一次** | 否:兩表同名列均保留,需別名區分 |
| 可讀性 | 高:意圖明確、代碼簡潔 | 靈活但冗長 |
| 移植性 | MySQL、PostgreSQL、Oracle 支持 | 標準 SQL,全數據庫支持 |
CREATE TABLE a (id INT, name VARCHAR(10));
CREATE TABLE b (id INT, score INT);
INSERT INTO a VALUES (1, 'Alice'), (2, 'Bob');
INSERT INTO b VALUES (1, 90), (2, 85);
-- USING: id 只出現一次
SELECT * FROM a JOIN b USING(id);
+----+-------+-------+
| id | name | score |
+----+-------+-------+
| 1 | Alice | 90 |
| 2 | Bob | 85 |
+----+-------+-------+
-- ON: id 出現兩次 (a.id, b.id)
SELECT * FROM a JOIN b ON a.id = b.id;
+----+-------+----+-------+
| id | name | id | score |
+----+-------+----+-------+
| 1 | Alice | 1 | 90 |
| 2 | Bob | 2 | 85 |
+----+-------+----+-------+
a.id > b.id)、複合條件(a.id = b.id AND a.type = b.type)、或為了跨數據庫移植性。USING 和 ON 易讀性極差,統一風格。SELECT a.id, a.name, b.score FROM a JOIN b USING(id) 明確列來源,防歧義。JOIN ... USING() 是針對同名列等值連接的語法糖,能自動去重結果集連接列,提升可讀性。掌握其「同名、等值、去重」三大特徵,在標準化表結構的項目中大膽使用;複雜場景毫不猶豫轉向 ON。