MySQL左连接操作中on和where放置条件有什么区别?
优先级
同样的条件,结果集可能不同,就是因为优先级。 on的优先级高于where。
首先澄清两个概念:
LEFT JOIN关键字将返回左表(table_name1)中的所有行,即使它们位于右表中表(table_name2 中没有匹配的行)。
当数据库通过连接两个或多个表来返回记录时,会生成一个中间临时表,然后将这个临时表返回给用户。
在left join下,两者的区别是:
On是生成临时表时使用的条件。无论是否开启无论条件是否有效,都将返回左表(table_name1 的行)。
Where是临时表生成后使用的条件。这时候,是否使用left join并不重要。只要条件不成立,所有行都会被过滤掉。
测试
表1:表1
id | 否 |
---|---|
1 | n1 |
2 | n2 |
3 | n3 |
否 | 名称 |
---|---|
n1 | aaa |
n2 | bbb |
n3 | ccc |
选择a.id,a.No ,b.name from table1 a left join table2 b on (a.No = b.No and b.name='aaa');select a.id,a.No,b.name from table1 a left join table2 b on (a .No = b.No) where b.name='aaa';
第一个结果集:
|id |否 |名称 ||---|---|---||1 |n1 |aaa||2 |n2 |(Null)||3 | n3 |(Null)|
第二个结果集:
|id |No |name||---|---|- --||1 |n1 |aaa|
第一条SQL的执行过程:首先找到b表中名称为aaa的记录行(on(a.No = b.No and b.name= 'aaa'))。然后找到a的数据(即使不符合b表的规则),生成临时表返回给用户。
第二条SQL的执行过程:先生成临时表,然后执行where过滤结果集where b.name='aaa' is not true,最后返回用户。
因为on会先过滤掉不符合条件的行,然后再进行其他操作,按理说on是最快的。
在多表查询中,on比where更早生效。系统首先根据连接情况将多个表组合成一个临时表b在每个表之间,然后按where过滤,然后计算。计算完毕后,通过have进行过滤。可见,想要过滤条件发挥正确的作用,首先要了解条件应该在什么时候生效,然后决定放置在哪里。
对于参与JOIN的表的关联操作,如果连接不满足,如果需要的条件行也在我们的查询范围内,那么我们必须把连接条件放在ON之后,而不是WHERE之后。如果我们把连接条件放在WHERE之后,那么所有的LEFT、RIGHT等操作都将不起作用。在这种情况下,其效果与 INNER 连接完全相同。对于那些不影响行选择的条件,只需将它们放在ON或WHERE之后即可。
记住:所有的连接条件必须放在ON之后,否则之前所有的LEFT和RIGHT关联都将被用作装饰而不会产生任何效果。
感谢您的阅读!这篇关于《MySQL left join操作中on和where放置条件有什么区别》的文章就分享到这里,希望以上内容能够给大家带来一些帮助,让大家进一步了解知识。如果您觉得文章不错,可以分享出去,让更多的人看到!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > MySQL左连接操作中on和where放置条件有什么区别?
![自居资源网](/uploadfile/202310/c6ad11ffde77492.png)