Group By 和having的用法
目录
1 前言
对于一些小白同学来说,mysql中的一些聚合函数、分组或者having的一些用法总是感觉理解起来稍微吃力,今天对其做一个整理,并举一些平时开发中常见的例子来说明。
2 Group By、having
字面意思,我们也能知道group by是分组的意思。但是通常group by经常和聚合函数配合使用。
所以我们通常能够用group by干什么呢?比如:分组之后可以计数(Count)、求和(SUM)、求平均数(AVG)。
数据准备如下:

1)此时,想知道每门学科的最高分
SELECT course ,Max(score) AS 最高分数 FROM `t_user` t GROUP BY course
结果:

可以发现,我们用了group by对于分组后每个分组都会返回该组的一个结果,按照学科分组,每个学科都会返回一个值最大值或是最小值亦或者是平均值
2)想知道考试时间在2022-09-07号之前每门学科的最高分
SELECT course ,MAX(score) AS 最高分数 FROM `t_user` t WHERE t.create_time > '2022-09-07' GROUP BY course
结果:

可以发现,我们用了where,这个时候,数学的最高分已经不是105分了,而是72分。说明where条件是在group by分组之前执行的.
3)想知道考试时间在2022-09-07号之前每门学科最高分数在70以上有多少人
SELECT course ,MAX(score) AS 最高分数 FROM `t_user` t WHERE t.create_time > '2022-09-07' GROUP BY course HAVING(最高分数) > 70
结果:

可以发现 我们用了having,对分组之后的结果进行了一个筛选。
3 总结
1)如果要用到group by分组,那么select字句后面的列名必须为分组列或者列函数(如上根据课程分组后,select 字句中为课程和课程的函数列)
SELECT course ,Max(score) AS 最高分数,`name` FROM `t_user` t GROUP BY course
如果像上面一样包含其它的列,就会报如下错误,因为分组之后根本不知道name是哪一个。

2)where、group by、having连用时,它们三者的的顺序必须是where在前,group by在中,having在后(有having必须有group by,有group by不一定有having)
3)where在前是对group by分组之前的筛选,having在后是对group by分组之后的筛选

浙公网安备 33010602011771号