dbaplus社群 03月14日
MySQL惊天陷阱:left join时选on还是where?
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了SQL中Left Join语句中ON和WHERE子句的区别。核心在于ON条件决定了如何生成中间临时表,即使ON条件不满足,左表的所有记录仍然会保留。而WHERE条件则是在临时表生成之后进行过滤,不满足WHERE条件的记录会被完全排除。理解这一点对于编写高效、准确的SQL查询至关重要,尤其是在处理需要保留左表全部数据的场景下。Inner Join则没有这种特殊性,ON和WHERE条件的效果相同。

🔗 **On条件与临时表生成**: 在LEFT JOIN中,ON条件用于生成中间临时表,即使ON条件不为真,左表的所有记录都会被保留,而右表则会显示NULL值。

🎯 **Where条件与结果过滤**: WHERE条件在临时表生成后应用,用于过滤整个结果集。如果WHERE条件不满足,则整个记录(包括左表和右表的列)都会被排除。

💡 **Inner Join的特性**: 与LEFT JOIN不同,INNER JOIN没有这种特殊性。INNER JOIN中,条件放在ON和WHERE中,最终返回的结果集是相同的,都必须满足连接条件才能被包含在结果中。

2025-03-14 07:15 广东

一个虽然简单,但容易被忽视的问题!


前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条,奈何发现还是有两条。


后来发现 join on and 不会过滤结果记录条数,只会根据and后的条件是否显示 B表的记录,A表的记录一定会显示。


不管and 后面的是A.id=1还是B.id=1,都显示出A表中所有的记录,并关联显示B中对应A表中id为1的记录或者B表中id为1的记录。


运行sql:


SELECT *FROM student s LEFT JOIN class c ON s.classId = c.idORDER BY s.id



运行sql:


SELECT *FROM student s LEFT JOIN class c ON s.classId = c.id  AND s.name = '张三'ORDER BY s.id



运行sql:


SELECT *FROM student s LEFT JOIN class c ON s.classId = c.id  AND c.name = '三年级三班'ORDER BY s.id



数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。


在使用left join时,on和where条件的区别如下:



假设有两张表:


表1:tab2



表2:tab2



两条SQL:


第一条:


select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’


第二条:


select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)


第一条SQL的过程:


1、中间表on条件:


tab1.size = tab2.size



2、再对中间表过滤 where 条件:


tab2.name=’AAA’



第二条SQL的过程:


1、中间表on条件:


tab1.size = tab2.size and tab2.name=’AAA’


PS:条件不为真也会返回左表中的记录



其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。


而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。


作者丨jcpp9527

来源丨网址:blog.csdn.net/wqc19920906/article/details/79785424

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn


阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

SQL Left Join On条件 Where条件
相关文章