「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」
在上篇文章中:使用SELECT的排序和聚合函数功能——MySQL数据库学习笔记(五),我们学会了通过使用ORDER BY对结果进行排序、使用COUNT、SUM、AVG、MAX、MIN聚合函数汇总数据等
本篇文章将介绍SELECT语句的GROUP BY对数据分组统计。
查询结果分组统计
前面的所有例子都是对全表进行统计,有时我们需要更加精细的统计,比如统计每个学生的考试平均成绩,而不是所有学生的考试平均成绩,这时就需要用到查询语句的分组统计功能。
分组功能是通过子句GROUP BY来实现。GROUP BY可以将统计控制在组级。分组的目的是细化聚合函数的作用对象。在一个查询语句中,可以使用多个列进行分组。它的语法如下:
GROUP BY <分组依据列> [,..., n ]
[HAVING <组提取条件>]
下面我们通过例子来练习
GROUP BY 子句
统计每门课程的选课人数,列出课程号和选课人数
SELECT Cno as 课程号, COUNT(Sno) as 选课人数 FROM SC GROUP BY Cno;
首先对SC表的数据按Cno的值进行分组,所有具有相同Cno值的归为一组,然后再对每一组使用COUNT函数进行计算,求每组的学生人数。
统计每个学生的选课门数和平均成绩
SELECT Sno 学号, COUNT(*) 选课门数, AVG(Grade) 平均成绩 FROM SC GROUP BY Sno;
统计每个系的学生人数和平均年龄
SELECT Sdept, COUNT(*) AS 学生人数, AVG(Sage) AS 平均年龄 FROM Student GROUP BY Sdept;
使用 WHERE 子句
统计每个系的女生人数
SELECT Sdept, COUNT(*) AS 女生人数 FROM Student WHERE Ssex = '女' GROUP BY Sdept;
这个语句会先执行WHERE语句进行筛选数据,之后执行GROUP BY语句进行分组操作。
多列分组)统计每个系的男生人数和女生人数,以及男生的最大年龄和女生的最大年龄,结果按系名的升序排列。
SELECT Sdept, Ssex, COUNT(*) 人数, MAX(Sage) 最大年龄 FROM Student GROUP BY Sdept, Ssex ORDER BY Sdept;
使用 HAVING 子句
HAVING子句用于对分组后的结果再进行筛选,它有点像WHERE子句,但它用于组而不是单个记录。在HAVING子句中可以使用统计函数,但在WHERE子句中则不能。HAVING通常与GROUP BY一起使用。
查询选修了3门以上课程的学生的学号和选课门数。
SELECT Sno, COUNT(*) 选课门数 FROM SC GROUP BY Sno HAVING COUNT(*) > 3;
先执行GROUP BY对SC表按Sno进行分组,然后再用统计函数COUNT分别对每一组进行统计,最后筛选出统计结果满足大于3的组。
查选选课门数大于等于4门的学生的平均成绩和选课门数
SELECT Sno, AVG(Grade) 平均成绩, COUNT(*) 选课门数 FROM SC GROUP BY Sno HAVING COUNT(*) >= 4;
正确理解WHERE、GROUP BY、HAVING子句的作用以及执行顺序,对编写正确的查询语句很有帮助。
- WHERE子句用来筛选FROM表中符合条件的数据。
- GRUOP BY子句用来对WHERE子句筛选后的数据进行分组。
- HAVING 子句用来对分组后的结果数据再进行筛选。
结尾
下篇文章继续学习多表连接查询数据。