首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL JOIN USING() 語法詳解:簡化等值連接的利器

     編輯:MySQL 資料庫相關知識

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) 指定的列必須在**兩個表中同名且同類型**。

多表鏈接:鏈式 USING

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 vs 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 |
+----+-------+----+-------+

最佳實踐建議

  • 優先用 USING:雙表等值連接且列名完全一致時,代碼最乾淨,結果集無冗余列。
  • 轉用 ON:列名不同、需非等值連接(如 a.id > b.id)、複合條件(a.id = b.id AND a.type = b.type)、或為了跨數據庫移植性。
  • 避免混用:單條 SQL 中混用 USING 和 ON 易讀性極差,統一風格。
  • 別名配合:SELECT a.id, a.name, b.score FROM a JOIN b USING(id) 明確列來源,防歧義。

總結

JOIN ... USING() 是針對同名列等值連接的語法糖,能自動去重結果集連接列,提升可讀性。掌握其「同名、等值、去重」三大特徵,在標準化表結構的項目中大膽使用;複雜場景毫不猶豫轉向 ON。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved