SQL 查询条件放在LEFT OUTER JOIN 的ON语句后与放在WHERE中的区别
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了SQL 查询条件放在LEFT OUTER JOIN 的ON语句后与放在WHERE中的区别,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1863字,纯文字阅读大概需要3分钟。
内容图文
这两种条件放置的位置不同很容易让人造成混淆,以致经常查询出莫名其妙的结果出来,特别是副本的条件与主表不匹配时,下面以A,B表为例简单说下我的理解。
首先要明白的是:
跟在ON 后面的条件是对参与左联接的数据进行筛选,即在左联接之前起作用。
跟在WHERE后的条件是对左联接得到的结果集进行筛选,即在左联接之后起作用。
我直接把我的结论发出来,建议朋友们自行测试一下,下面是结论:
1) 如果条件是由主表和副表之间的字段构成,那么放在ON后与放在WHERE子条件中所得到的结果是一样,即这种条件可以随便放,甚至在SQL中建视图时,会自动优化放到ON条件后。
如下:
select * from A LEFT OUTER JOIN B ON A.Id=B.UserId AND A.Name=B.UserName
select * from A LEFT OUTER JOIN B ON A.Id=B.UserId WHERE A.Name=B.UserName
上面两个语句的结果是一样的,如果用这条语句去建视图,SQL管理器会自动优化成第一句的写法,大家可以亲自试验下。
2)如果条件是由进行左联接的两个表中的一个表的字段构成,则结果会很不一样。
1:select * from A LEFT OUTER JOIN B ON A.Id=B.UserId AND B.IsDel=0 (IsDel意思为记录是否删除,0为否,1为是。)
2:select * from A LEFT OUTER JOIN B ON A.Id=B.UserId WHERE B.IsDel=0
以上两句语句使用时要非常注意,这两种写法得到的数据是不一样的。
第一句的意思是:在进行左联接前,先从表B中筛选出没有标记为删除的数据后得到的结果再与A表进行左联接。
而第二句的意思是:在A,B表进行左联接后的,再对得到的结果进行“B.IsDel=0”条件过滤。
如果A表中有2条数据,在B表中都能匹配上,那么得到的结果是一样的,但是,假设A中只有一条记录在B中能匹配上,那么两条语句得到的结果就不一样了。
因为两表左联接后得到的结果集中的对应B.IsDel的列(假设生命为B_IsDel)的值其实是NULL值,那么再进行“B_IsDel=0”,这条记录就会被过滤掉了,
即最终的结果是第一条语句有两条数据,第二条语句只有一条。
此外,还有下面这种更离奇的情况,假设我们的需求是对A,B两表进行左联接,同时希望过滤掉A表中已经被删除了的数据和B表中已经被删除了的数据。可能会有如下两种写法:
3:select * from A LEFT OUTER JOIN B ON A.Id=B.UserId AND A.IsDel=0 AND B.IsDel=0 (IsDel意思为记录是否删除,0为否,1为是。)
4:select * from A LEFT OUTER JOIN B ON A.Id=B.UserId WHERE A.IsDel=0 AND B.IsDel=0
语句4能得到想要的结果。
语句3,这种写法很少见,执行后,大家会发现语句3的结果中包含了A表中A.IsDel=1的记录,这是为什么呢?
原因很简单,因为它是左联接,下面解释一下:
我们知道左联接的逻辑是A表或者说主表中的数据都会出现在最终的结果集中,那么“A.IsDel=0”这个条件在语句3左联接的过程起到了什么作用呢?
其作用是系统在进行左联接时,先在A表中用"A.IsDel=0"条件过滤数据(假设过滤掉了R1这条数据),用过滤后的结果再与B表进行左联接,
但最后整个语句返回的结果集中极会包含R1这条数据,只不过这条记录对应的B表中的字段全部为NULL值。请大家自行测试理解。
此时,如果想要达到我们的目的,必需在WHERE子句中增加A.IsDel=0条件,即:
select * from A LEFT OUTER JOIN B ON A.Id=B.UserId AND A.IsDel=0 AND B.IsDel=0 WHERE A.IsDel=0
但上面这条语句比较逻辑,也完全没必要这么写,因此我的建议是:针对单表字段构成的筛选条件这种情况,最好的做法是直接将条件放到WHERE子句中。
原文:http://www.cnblogs.com/lgx5/p/6239498.html
内容总结
以上是互联网集市为您收集整理的SQL 查询条件放在LEFT OUTER JOIN 的ON语句后与放在WHERE中的区别全部内容,希望文章能够帮你解决SQL 查询条件放在LEFT OUTER JOIN 的ON语句后与放在WHERE中的区别所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。