现有以下的学生信息表:
若果现在想计算每个班的平均年龄,使用where的操作如下:
SELECT Cno AS 班级, AVG(Sage) AS 平均年龄
FROM stu
Where Cno=5;
这样的话,有多少个班就需要操作几次
因此引入分组 GROUP BY子句,根据列来分组,先看一下《MySQL必知必会》的提示:
引入分组后,操作如下:
SELECT Cno AS 班级,AVG(Sage) AS 平均年龄 FROM stu GROUP BY Cno;
由此可以理解,GROUP BY 根据给出的列进行分组,具有相同列属性的被分到一组,然后你需要对组内的数据执行什么操作,就和平常的一样,只是操作的不再是所有的数据,而是分组后的。
过滤分组
使用GROUP BY将数据分组后,还可以使用HAVING过滤分组,规定包括哪些分组,排除哪些分组,比如想在上述的学生信息表中,找出多于2个人的班级,使用以下的操作
SELECT Cno AS 班级,COUNT(Cno) AS 人数
FROM stu
GROUP BY Cno
HAVING COUNT(Cno)>=2;
关于HAVING和WHERE的区别 《MySQL必知必会》
HAVING和WHERE的差别 这里有另一种理解方法,WHERE在数据 分组前进行过滤,HAVING在数据分组后进行过滤。
这是一个重 要的区别,WHERE排除的行不包括在分组中。这可能会改变计 算值,从而影响HAVING子句中基于这些值过滤掉的分组。
从sql语句上而言,WHERE是写在GROUP BY前的,而HAVING是在GROUP BY后的