上一篇对三个join的语句作了一个区别,若是连最基础的都不清楚,那么请先参考:inner join 与 left join 和right join之间的区别html
碰巧在项目中遇到了一个sql,是left join和where的条件限制的区别,想了好半天,这里作一下笔记,万一之后忘记了方便查看。sql
话很少说,直接上测试数据和sql,而后对个人理解进行分析下。post
student表和grade表测试
简单提一个需求是:我须要统计全部有成绩的学生信息。项目遇到那个问题比这个复杂,可是最终须要筛选的条件和这个大体相同,这里就举个栗子。url
这里分析一下,既然是学生信息,那么,确定就是以student为主表,关联的为grade表,写出下面条件。spa
SELECT stu.* FROM student stu LEFT JOIN grade gra on stu.id = gra.c_stuId AND gra.c_fs IS NOT NULL
查询结果以下:3d
仔细看看上面的sql,和需求,好像也没有什么错误呀,分数不为空,个人确是加了限制条件了啊, LEFT JOIN grade gra on stu.id = gra.c_stuId AND gra.c_fs IS NOT NULLcode
可是看看需求,是分数不为空的学生,可是李四的成绩的确是空的,结果仍是查出来了,咦,那么就奇怪了,问题出在哪里了呢。htm
这就回到以前咱们所说的,left join并不会影响主表,也就是说,不管LEFT JOIN on后面什么条件,主表学生成绩都会被查出来,因此说,这里的限制条件没用。blog
这时候就须要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条件只能针对主表字段去作一个筛选,并不能筛选从表的,如今通过上面一个小案例以后,算是有了一个大概的理解了,不知道有没有对你产生帮助,欢迎下方
评论,一块儿探讨。!!