首页/数据/SQL 速查/ON 与 WHERE 在外连接中的区别
本包目录(311 条)

ON 与 WHERE 在外连接中的区别

内连接里 ON 与 WHERE 可以互换;外连接中不能:ON 决定配对,WHERE 在配对结果上过滤,写在 WHERE 会滤掉补 NULL 的行。

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

对比

对比
-- 保留左表全部行:右表不匹配则为 NULL
SELECT * FROM orders o
LEFT JOIN users u ON u.id = o.user_id;

-- 过滤条件放在 WHERE:左表中配不到的行被剔除
SELECT * FROM orders o
LEFT JOIN users u ON u.id = o.user_id
WHERE u.status = 1;

把过滤放进 ON

把过滤放进 ON
SELECT * FROM orders o
LEFT JOIN users u
       ON u.id = o.user_id
      AND u.status = 1;     -- 保留左表全部行,只有匹配且 status=1 的右侧行被连上
ON描述两表如何配对(含附加匹配条件)
WHERE作用于连接之后的结果行
外连接结论右表列的过滤条件放 WHERE 会让外连接结果接近内连接

易错点

  • LEFT JOIN 后在 WHERE 过滤右表列(如 u.status=1)是常见的语义错误,会把未匹配行全部剔除
  • 反向也容易错:把左表的过滤条件写进 ON 会改变保留侧语义,左表条件应留在 WHERE

数据来源与参考

  • MySQL 8.0 Reference Manual · LEFT JOIN
  • PostgreSQL Documentation · Joined Tables
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌