首页/数据/SQL 速查/USING 与 NATURAL JOIN

USING 与 NATURAL JOIN

两表同名列可用 USING(col) 简化连接条件,结果中该列只出现一次;NATURAL JOIN 按所有同名列自动连接,隐式且风险高。

SQL 速查数据更新于 2026-10-13

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 的差异

对比项USINGON
列名要求两侧必须同名可用任意表达式
输出列合并为一列两侧各保留
意图表达隐含按同名列连接显式写明条件
结构变化影响列名变了会失效或报错不受影响
外连接的 NULL合并列取 COALESCE 语义保留两侧各自的 NULL
NATURAL JOIN 的风险在于表结构一改语义就变:给任意一侧加上同名列,连接条件立刻多一条,查询照常执行但结果完全不同,生产代码里尽量避免。
USING 要求两侧列名完全相同(例如都叫 order_id);列名不同时(比如 user_id 与 uid)只能老老实实写 ON。
合并后的列在后续连接里引用不会产生歧义,这是 USING 比 ON 省心的一点;但也正因为它把两列合成一列,跨表引用时容易忘记原始列名,读代码要留意。
三张以上表连接时还是回到 ON 更稳:USING 要求每一对表都有同名列,链式连接里只要有一处列名不同就写不下去,可读性也会明显变差。

易错点

  • NATURAL JOIN 在表新增同名列后会悄悄改变连接条件:查询能跑但结果不同,生产 SQL 不要用
  • 外连接配 USING 时忽略 COALESCE 语义:合并列的 NULL 表现与 ON 写法不同,对账时可能对不上
  • 以为 USING 能连接任意两列:要求两侧列名完全相同,否则直接报语法错误
  • 在 USING 里写表达式:它只接受列名列表,复杂条件必须用 ON
  • 同一份代码里 USING 与 ON 交织:连接条件难以快速核对,评审与排错都变慢

数据来源与参考

  • MySQL 8.0 Reference Manual · JOIN · USING
  • PostgreSQL Documentation · JOIN · USING
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌