在 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    | iPhone2.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将无法匹配。