通过MySQL提供的聚合函数,可以很方便的进行一些计算来辅助查询,所谓聚合函数就是将表中的数据统计后进行的某种处理
分组查询可以理解成将一张表按照某个属性分成多张表,属性值相同的在一张表里
比如说学生表,按照性别这个属性分组,就能分成两个表,一个男生表,一个女生表、
接下里详细了解一下有哪些聚合函数以及分组查询的具体使用
本文章用到三张表来做演示,一张学生表,一张课程表,还有一张学习表,具体定义如下图
聚合函数
1.count() 统计数目函数
这个函数用来返回查询到的数据的数量,通过用来统计有多少个数据
例如查询学生表中有多少个学生
count不会计入NULL值,如果想在统计数目是去掉重复的,可以使用distinct
例如统计名字不重复的同学的数目
select count(distinct name) from student;
2.sum()
该函数用来查询某一列的所有属性值的和,不是数字没有意义
比如查一张学习表中所有分数的总和
3.avg()
这个函数是求某个属性列的平均值,同样,如果属性列的值不是数字的话,那么就没有意义
接下来演示一下,一张学习表中,求所有成绩的平均值
4.max() , min()
查询某个属性列中最大值和最小值,同样,如果属性列中的值不是数字,那么查询结果没有意义
接下来查询成绩表中成绩最高的和成绩最低的
上面的这些聚合函数都可以加上distinct进行去重处理后再得出结果
分组查询
分组查询需要使用语句group by
这个语句可以按照指定的列进行分组,列中相同的值被分为一组,我们理解成每一组都是一张新的表,这样方便我们对后续操作的理解
什么情况下会用到分组呢?看下面这个问题
显示每一门课程的最高分数
这个问题,我们首先需要统计某一门课程总共有多少个人选,然后再统计选这门课程的最高成绩,显示出来即可,课程号以及成绩都在学习表中,如果能把相同的课程单独拎出来放在一起,那么问题就好解决了,而分组查询就是进行这样的操作
首先,我们在学习表中将课程号进行一个分组,课程号相同的放在一起,然后再统计课程号相同的同学中成绩最高的那一个,具体操作如下
select cou_id, max(grade) as max_grade from study group by cou_id;
对照查询结果可以看出,总共有4门课程,每一门的课程的最大值都显示出来了
接下来,我们将难度加大一点,查询平均分不低于80分的课程
这个问题要求我们将每门课程先求平均分,然后再进行一个筛选,如果大于80就显示
那么我们如何将分组后并求出平均值的课程再进行一个筛选呢?
这就要用到另一个语句having,having有点类似于where,都是进行条件筛选,不过having是分组进行数据的筛选,解决上面问题的语句如下
select cou_id, avg(grade) as avg_value from study group by cou_id having avg_value >= 80;