MySQL左连接操作中on和where放置条件有什么区别?

分类:编程技术 时间:2024-02-20 15:23 浏览:0 评论:0
0
本文将与大家分享MySQL左连接操作中on和where放置条件的区别。小编觉得还是比较实用的,所以分享给大家,作为参考。下面就跟随小编来看看吧。

优先级

同样的条件,结果集可能不同,就是因为优先级。 on的优先级高于where。

首先澄清两个概念:

LEFT JOIN关键字将返回左表(table_name1)中的所有行,即使它们位于右表中表(table_name2 中没有匹配的行)。

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

在left join下,两者的区别是:

On是生成临时表时使用的条件。无论是否开启无论条件是否有效,都将返回左表(table_name1 的行)。

Where是临时表生成后使用的条件。这时候,是否使用left join并不重要。只要条件不成立,所有行都会被过滤掉。

测试

表1:表1

表 2:表2

id
1n1
2n2
3n3
名称
n1aaa
n2bbb
n3ccc
选择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放置条件有什么区别》的文章就分享到这里,希望以上内容能够给大家带来一些帮助,让大家进一步了解知识。如果您觉得文章不错,可以分享出去,让更多的人看到!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > MySQL左连接操作中on和where放置条件有什么区别?

用户评论