美文网首页
mysql~group by

mysql~group by

作者: 魏小小伊 | 来源:发表于2020-11-24 14:52 被阅读0次

不知咋滴,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。

相关文章

网友评论

      本文标题:mysql~group by

      本文链接:https://www.haomeiwen.com/subject/sjqbiktx.html