不知咋滴,sql里,group by真是最让我头疼的,其他的看过后就挺明白的,但是这个就像和我犯冲似的,一直不明白,洲哥已经给我讲了两年啦~我哭~也是辛苦他啦~所以整理记录其实是为了让自己记忆深刻。
———————————————————————————————————
group by——>分组
表先放这,学生表吧,最简单的。
(数据咱先不管,连表那些咱也先不管,就把学生信息和成绩信息先放在一张表了)
image.png
第一部分:最简单的分组——单条件分组——“7年级,男/女,语文平均分”
image.png分析:
1、语文平均分是我们要查询的结果,平均分使用avg;
2、第一个条件“7年级”,where后面的条件找到;
3、与分组有关最重要的,分组“男/女”,group by后面的条件也找到。
这里可以记录一下基本规则rule:
1、使用group by一般会和聚合函数联合使用(聚合函数:count、avg、max、min、sum);
2、group by 后面所加的内容,才可以出现在select后面,并且不加聚合函数。
第二部分:也简单的分组——多条件分组——“不同年级,男/女,语文平均分”
image.png分析:
1、语文平均分是我们要查询的结果,平均分使用avg;
2、第一个条件“不同年级”,说明是分组,group by 后面条件找到;
3、“男/女”,说明也是分组,group by 后面第二条件也找到。
第三部分:拓展与group by连用的having——““7年级,男/女,语文平均分,大于70分的性别””(虽然例子不是很好hh~)
image.png分析:
1、语文平均分是我们要查询的结果,平均分使用avg;
2、第一个条件“7年级”,where后面的条件找到;
3、与分组有关最重要的,分组“男/女”,group by后面的条件也找到;
4、平均分大于70分,那得是平均分聚合后“>70”了;这一条件放在哪呢?
结论:
如果像如上这么写会报错,原因涉及到sql的exec_plan“执行计划”。
解释一下,平均分的结果avg_score会在group by执行之后才得到,而我们在where后面就使用了avg_score>70,相当于已经使用了group by执行后得到的avg_score,显然,还没有avg_score的结果,那就一定会报错了。
所以正确写法,是要引入与group by连用的having,正确写法如下:
image.png
由此得到where和having的区别:
1、having与group by一起用;
2、聚合值作为的条件只能放在having的后面;
3、运行顺序where会前于having。
网友评论