leftjoinon后⾯加条件和where后⾯加条件的区别
上⼀篇对三个join的语句做了⼀个区别,如果连最基础的都不清楚,那么请先参考:
碰巧在项⽬中遇到了⼀个sql,是left join和where的条件限制的区别,想了好半天,这⾥做⼀下笔记,万⼀以后忘记了⽅便查看。
话不多说,直接上测试数据和sql,然后对我的理解进⾏分析下。
student表和grade表
简单提⼀个需求是:我需要统计所有有成绩的学⽣信息。项⽬遇到那个问题⽐这个复杂,但是最终需要
筛选的条件和这个⼤致相同,这⾥就举个栗⼦。
这⾥分析⼀下,既然是学⽣信息,那么,肯定就是以student为主表,关联的为grade表,写出下⾯条件。
SELECT
stu.*
FROM
student stu
多表left joinLEFT JOIN grade gra on stu.id = gra.c_stuId AND gra.c_fs IS NOT NULL
查询结果如下:
仔细看看上⾯的sql,和需求,好像也没有什么错误呀,分数不为空,我的确是加了限制条件了啊, LEFT JOIN grade gra on stu.id = gra.c_stuId AND gra.c_fs IS NOT NULL
但是看看需求,是分数不为空的学⽣,但是李四的成绩的确是空的,结果还是查出来了,咦,那么就奇怪了,问题出在哪⾥了呢。
这就回到之前我们所说的,left join并不会影响主表,也就是说,⽆论LEFT JOIN on后⾯什么条件,主表学⽣成绩都会被查出来,所以说,这⾥的限制条件没⽤。
这时候就需要where这个⽼⼤上场了。将上⾯查询sql修改如下:
SELECT
stu.*
FROM
student stu
LEFT JOIN grade gra on stu.id = gra.c_stuId
WHERE gra.c_fs is NOT null
查询结果如下:
咦,是吧,达到了预期的⽬的,id为3的学⽣分数是空的,那么最后查询出来的也没有包含他。这就是where的厉害之处。
那么,到底是为什么呢,我们说下,on只是对局部条件做限制,⽽where是对全局做限制,什么是全局做限制呢,也就是相当于,对最后查询出来的整个结果做限制。其实我们可以把
所有的字段都查出来,然后看⼀下,就⼀⽬了然了。
为了⽅便我就直接截图说明:
加上gra.*⼀看就知道,查询出来的整个数据就是如上所⽰,⽽where的作⽤是什么呢,是对全局进⾏限制,就相当于上⾯查询出来的⼜是⼀个新的表,我来对这个做限制。
如图所⽰:
where加上就相当于对这个结果集再次进⾏限制,把分数为空的去掉了,最终结果如下:
但是因为我们查询的时候,如上图所⽰红⾊⽅框所显⽰的,并没有查询出来,所以并不能⼀⽬了然的看到分数这个字段,因此会产⽣⼀开始所看到的那种情况,另外也是因为之间没接
触过,以前以为where条件只能针对主表字段去做⼀个筛选,并不能筛选从表的,现在经过上⾯⼀个⼩案例之后,算是有了⼀个⼤概的理解了,不知道有没有对你产⽣帮助,欢迎下⽅
评论,⼀起探讨。!!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论