前言
前面我们学习了MySQL中比较常用的简单查询和条件查询,今天来学习一下更高级的分组聚合查询。
MySQL中常用聚合函数表
函数名 | 说明 |
COUNT([DISTINCT | ALL] ) | 统计数据表中的记录数 |
COUNT([DISTINCT | ALL] <列名> ) | 统计数据表中的一列中值的个数 |
MAX([DISTINCT | ALL] <列名>) | 求数据表的一列值中的最大值 |
MIN([DISTINCT | ALL] <列名>) | 求数据表的一列值中的最小值 |
SUM([DISTINCT | ALL] <列名>) | 计算数据表的一列中值的总和 |
AVG([DISTINCT | ALL] <列名>) | 计算数据表的一列中值的平均值 |
其中,如果指定关键字DISTINCT,则表示在计算时要取消指定列中的重复值;如果不指定DISTINCT短语或指定ALL短语(ALL为默认值),则表示不取消重复值。PS.除了函数COUNT(*)外,其余聚合函数(包括COUNT(<列名>))都会忽略空值。
下面根据之前的表来做一下示例。这里只给出SQL命令。
#查询学生总人数
SELECT COUNT(*) FROM tb_student;
#查询选修了课程的学生总人数
SELECT COUNT(DISTINCT studentNo) FROM tb_score;
#计算选修课程编号为“2017001”的学生平均成绩
SELECT AVG(score) FROM tb_score WHEREcourseNo=’ 2017001;
#计算选修课程编号为“2017001”的学生最高分
SELECT MAX(score) FROM tb_score WHEREcourseNo=’ 2017001;
#如果有学生先修课程后没有成绩,即字段score的值为空,在使用SUM(score)、AVG、MAX、MIN等聚合函数进行计算时,系统都会自动忽略空值。
分组聚合查询
分组聚合查询是通过把聚合函数(如COUNT()、SUM()等)添加到一个带有GROUP BY分组子句的SELECT语句中来实现的。
GROUP BY子句的语法格式是:
[GROUP BY 字段列表] [HAVING <条件表达式>]
其中,GROUP BY对查询结果按字段列表进行分组,字段值相等的记录分为一组;指定用于分组的字段列表可以是一列,也可以是多个列,彼此间用逗号分隔;HAVING短语对分组的结果进行过滤,仅输出满足条件的组。
PS.使用GROUP BY子句后,SELECT子句的目标列表达式只能包含GROUP BY子句中字段列表和聚合函数。
下面看一下具体实例SQL:
#查询各个课程号及相应的选课人数
SELECT courseNo, COUNT(studentNo) FROM tb_scoreGROUP BY courseNo;
#查询每个学生的选课门数、平均分和最高分
SELECT studentNo, COUNT(*) 选课门数, AVG(score) 平均分, MAX(score) 最高分 FROM tb_score GROUP BY studentNo;
#查询学生选课的平均成绩,只取大于80分的才输出
SELECT AVG(score) 平均分 FROM tb_scoreHAVING AVG(score)>=88;
小结
上面就是今天的主题内容了,今天简单分享下MySQL中的分组聚合查询,这对数据分析很有帮助,可以分各个维度的数据指标。希望通过上面的操作能帮助大家。