USING 与 NATURAL JOIN
两张表有同名列时可以用 USING(列) 简化连接条件,结果里该列只出现一次;NATURAL JOIN 更激进,按所有同名列自动连接,语义随表结构变化。显式写 ON 的价值是意图清楚、不会因为加了一列而改变含义,生产 SQL 建议用 ON。
基本信息
| USING | 同名列连接,输出列合并为一列 |
|---|---|
| NATURAL JOIN | 按全部同名列自动连接,语义随表结构变化 |
| 外连接差异 | USING 配合外连接时合并列取 COALESCE 语义 |
| 建议 | 生产 SQL 用 ON 显式列出连接条件 |
| 适用平台 | MySQL 与 PostgreSQL 均支持 |
典型使用场景
- 关联表与外键列同名时少写一点条件
- 快速探索陌生数据时用 NATURAL JOIN 看关联
- 排查「加了一列之后结果突然变了」的问题
- 对比 USING 与 ON 在外连接下的 NULL 表现
- 代码评审时统一连接写法
示例
示例
-- USING:同名列只写一次,输出里该列合并为一列
SELECT o.id, i.product_name, i.qty
FROM orders o
JOIN order_items i USING (order_id);
-- 等价的 ON 写法:意图更明确
SELECT o.id, i.product_name, i.qty
FROM orders o
JOIN order_items i ON i.order_id = o.order_id;
-- NATURAL JOIN:按所有同名列自动连接
SELECT * FROM orders NATURAL JOIN order_items;USING 与 ON 的差异
| 对比项 | USING | ON |
|---|---|---|
| 列名要求 | 两侧必须同名 | 可用任意表达式 |
| 输出列 | 合并为一列 | 两侧各保留 |
| 意图表达 | 隐含按同名列连接 | 显式写明条件 |
| 结构变化影响 | 列名变了会失效或报错 | 不受影响 |
| 外连接的 NULL | 合并列取 COALESCE 语义 | 保留两侧各自的 NULL |
NATURAL JOIN 的风险在于表结构一改语义就变:给任意一侧加上同名列,连接条件立刻多一条,查询照常执行但结果完全不同,生产代码里尽量避免。
USING 要求两侧列名完全相同(例如都叫 order_id);列名不同时(比如 user_id 与 uid)只能老老实实写 ON。
合并后的列在后续连接里引用不会产生歧义,这是 USING 比 ON 省心的一点;但也正因为它把两列合成一列,跨表引用时容易忘记原始列名,读代码要留意。
三张以上表连接时还是回到 ON 更稳:USING 要求每一对表都有同名列,链式连接里只要有一处列名不同就写不下去,可读性也会明显变差。