数据库系统原理:聚集函数
SQL命令包括数据定义、查询、操纵和控制四大类,其中数据查询是数据库的核心操作。
学习在SQL数据查询中使用聚集函数的方法。
一、五种聚集函数介绍
聚集函数(集合函数)→垂直方向(一个值):主要用法是在垂直方向上把多个值变为一个值。
(1)count(计数函数)
count([distinct]<列名>):统计一列中值的个数,不计算空值;
count([distinct]*):计算元组的个数(行数),不管列值是否为空。
distinct:可选项,表示不计重复元组。
(2)sum(求和函数)
sum([distinct]<列名>):计算一列的总和(要求此列必须是数值型)。
(3)avg(平均值)
avg([distinct]<列名>):计算一列的平均值(要求此列必须是数值型)。
(4)max(最大值)
max([distinct]<列名>):求一列值中的最大值。
(5)min(最小值)
min([distinct]<列名>):求一列值中的最小值。
除count(*)外,其他的函数计算涉及到列中的空值都要先去掉再计算。
二、聚集函数的举例
例图
例1:求c2课程的平均成绩。
Select avg(grade)
From SC
Where cno = 'c2';
此查询的结果为:(80+70+90)/3=80
每个学生的课程成绩是记录在SC表的中的,所以要从SC表中获取成绩数据;要选择的是课程c2的成绩,所以选择条件是“课程号是c”;选择之后有四行数据,要计算的是选择c2这门课的平均成绩,所以在选择的时候“SELECT”了avg(grade),而表示直接选择成绩。
使用了聚集函数,它把多个值计算为一个值。由于是使用avg函数,所以计算的时候是去掉了空值才计算的。
例2:求男同学的总人数和平均年龄。
Select count(*), avg( age)
From S
Where sex='男'
从S表中、条件是“性别是男生”,计算总的人数使用count(*)来表示;使用avg( age)来计算总的男生的平均年龄。
例3:统计选修了课程的学生人数。
Select count(sno) // count(distinct sno)
From SC ;
学生选课信息是记录在SC表中的,那么统计学号的个数就计多少个学生选课。
如果出现一个学生选多门课、只能计算一次的情况,需要使用distinct去除重复的学号信息
例4:求选修课程c2的学生的最高分和最低分。
Select max(grade)as最高分,min(grade)
From SC
Where cno= 'c2';
选修课程是在SC表中,条件是“课程号是c2”,需要它们的选课成绩,计算它们的最高分、最低分。
从SC表中查询选择课程c2的学生的最高分和最低分,从下图的数据中可以看出课程c2最高分是78、最低分是50;当结果输出的时候,如果不起名字的话,它是以“无列名”来表示的,这样的话结果无法明确的表示“78”和“50”的含义是什么。
所以,通常在有计算的列输出的时候会给它起名字来标识这一列的值的含义。所以,在使用聚集函数的时候最好使用别名来改变列标题。
三、总结
在查询中使用聚集函数可以增强查询的检索功能,方便用户操作。需要注意的是在涉及列的聚集函数都跳过空值而只处理非空值即去掉空值以后再计算。
需要注意,在where子句中不能使用聚集函数作为条件表达式,例如查找平均分大于80的学生学号,不能使用:
"Select sno From SC Where avg(grade)>80"。会出现出错提示。
此外,聚集函数也不能嵌套使用。