在 SQL 中,USING
是一种用于简化 JOIN
操作的语法糖,它允许你明确指定连接表时所依据的列名。与传统的 ON
子句相比,USING
提供了更简洁的语法
1. 基本语法与作用
table1 JOIN table2 USING (column_name);
将 table1
和 table2
中 column_name
值相同的行连接在一起
例:假设有两个表:Orders
(包含 order_id
, cust_id
)和 OrderItems
(包含 item_id
, order_id
, product
)
使用 ON
子句:
SELECT * FROM Orders JOIN OrderItems ON Orders.order_id = OrderItems.order_id;
使用 USING
子句:
SELECT * FROM Orders JOIN OrderItems USING (order_id);
2. USING
的核心特性
2.1 自动去重重复列
当使用 USING
时,结果集中只会包含一个 column_name
(即连接列)。而使用 ON
时,连接列会在结果中出现两次(来自两个表)。
使用 USING 的结果:
order_id | cust_id | item_id | product
----------------------------------------
1001 | 1 | 2001 | iPhone
使用 ON 的结果:
Orders.order_id | OrderItems.order_id | cust_id | item_id | product
-----------------------------------------------------------------------
1001 | 1001 | 1 | 2001 | iPhone
2.2 与 GROUP BY
、ORDER BY
结合使用
当在 GROUP BY
或 ORDER BY
中引用连接列时,无需指定表名,直接使用列名即可。
SELECT order_id, COUNT(*)
FROM Orders
JOIN OrderItems USING (order_id)
GROUP BY order_id; -- 直接使用 order_id,无需表名前缀
2.3 与 SELECT
结合使用
在 SELECT
列表中引用连接列时,不能使用表名前缀(否则会报错)。
3. 多列 USING
USING
可以同时指定多个连接列,用逗号分隔:
table1 JOIN table2 USING (col1, col2, ...);
例:
假设 Employees
和 Departments
表通过 dept_id
和 location
两个列关联:
SELECT *
FROM Employees
JOIN Departments USING (dept_id, location);
使用 USING
的注意事项
- 连接列必须存在于两个表中:如果某个表中不存在
USING
指定的列,会导致语法错误。 - 数据类型必须兼容:两个表的连接列数据类型必须一致,否则可能导致隐式类型转换或错误。
- 避免在子查询中重命名连接列:如果子查询中对连接列使用了别名(如
SELECT order_num AS oid ...
),USING
将无法匹配。