ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MySQL外连接on或where相同筛选条件结果会不同

MySQL外连接on或where相同筛选条件结果会不同 生产中常见的不注意写法经常有人写外连接的SQL在on和where都会加一些筛选条件比如-- on里面加过滤 select * from t1 left join t2 on t1.idt2.t1_id and t2.xxx ! null; -- where里面加过滤 select * from t1 left join t2 on t1.idt2.t1_id where t2.xxx ! null;他们的执行语义和结果会完全不同。验证一下先创建表和记录执行连接查询SQL条件是用户id连接充值记录-- on里加过滤 SELECT u.id, u.name, r.amount FROM user u LEFT JOIN recharge r ON u.id r.user_id AND r.amount IS NOT NULL; -- where里加过滤 SELECT u.id, u.name, r.amount FROM user u LEFT JOIN recharge r ON u.id r.user_id WHERE r.amount IS NOT NULL;执行结果结论ON 中的条件只决定右表记录是否参与匹配左表记录仍会全部保留而 WHERE 是连接完成后对最终结果集进行过滤因此在生产环境使用外连接时如果确实要过滤掉不符合条件的记录应将最终过滤条件放在 WHERE 中否则放在 ON 中可能导致结果行数比预期更多。内连接(Inner Join)的on和where相同筛选条件,结果会不同?直接执行SQL:-- on条件 SELECT * FROM user u JOIN recharge r ON u.id r.user_id AND r.amount 100; -- where条件 SELECT * FROM user u JOIN recharge r ON u.id r.user_id WHERE r.amount 100;执行结果过滤条件对innerJoin内连接是没有影响的
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进