使用SELECT的GROUP BY对数据分组统计——MySQL数据库学习笔记(六)

·  阅读 80
使用SELECT的GROUP BY对数据分组统计——MySQL数据库学习笔记(六)

「这是我参与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函数进行计算,求每组的学生人数。

image.png

统计每个学生的选课门数和平均成绩

SELECT Sno 学号, COUNT(*) 选课门数, AVG(Grade) 平均成绩 FROM SC GROUP BY Sno;
复制代码

image.png

统计每个系的学生人数和平均年龄

SELECT Sdept, COUNT(*) AS 学生人数, AVG(Sage) AS 平均年龄 FROM Student GROUP BY Sdept;
复制代码

image.png

使用 WHERE 子句

统计每个系的女生人数

SELECT Sdept, COUNT(*) AS 女生人数 FROM Student WHERE Ssex = '女' GROUP BY Sdept;
复制代码

这个语句会先执行WHERE语句进行筛选数据,之后执行GROUP BY语句进行分组操作。

image.png

多列分组)统计每个系的男生人数和女生人数,以及男生的最大年龄和女生的最大年龄,结果按系名的升序排列。

SELECT Sdept, Ssex, COUNT(*) 人数, MAX(Sage) 最大年龄 FROM Student GROUP BY Sdept, Ssex ORDER BY Sdept;
复制代码

image.png

使用 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的组。

image.png

查选选课门数大于等于4门的学生的平均成绩和选课门数

SELECT Sno, AVG(Grade) 平均成绩, COUNT(*) 选课门数 FROM SC GROUP BY Sno HAVING COUNT(*) >= 4;
复制代码

正确理解WHERE、GROUP BY、HAVING子句的作用以及执行顺序,对编写正确的查询语句很有帮助。

  • WHERE子句用来筛选FROM表中符合条件的数据。
  • GRUOP BY子句用来对WHERE子句筛选后的数据进行分组。
  • HAVING 子句用来对分组后的结果数据再进行筛选。

image.png

结尾

下篇文章继续学习多表连接查询数据。

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改