3.7 聚集函数
什么是聚集函数
聚集函数
是以值的一个集合(集或多重集)为输入、返回单个值的函数。
五个固有聚集函数 avg min max sum count
SQL
提供了五个固有聚集函数
- 平均值:
avg
- 最小值:
min
- 最大值:
max
。 - 总和:
sum
。 - 计数:
count
。
其中sum
和avg
的输入必须是数字集
,
其他运算符(min,max,count)
还可作用在非数字数据类型
的集合上,如字符串。
3.7.1 基本聚集
sum实例 找出Computer Science
系所以教师的总工资
1 | select sum(salary) as sum_salary |
1 | mysql> select sum(salary) as sum_salary |
avg实例 找出Computer Science
系教师的平均工资
1 | select avg(salary) |
该查询的结果是一个具有单属性
的关系,其中只包含一个元组,这个元组的数值对应Computer Science
系教师的平均工资。
1 | mysql> select avg(salary) |
使用as重命名聚集函数的结果
数据库系统可以给结果关系的属性一个任意的名字,该属性是由聚集产生的。然而,我们可以用as
子句给属性赋个有意义的名称,如下所示:
1 | select avg(salary) as avg_salary |
1 | mysql> select avg(salary) as avg_salary |
在instructor
关系中, Computer Science
系的工资值是75000美元、65000美元和92000美元,平均工资是232000/3=773333
美元。
重复值
计算平均值是注意要保留重复元组
在计算平均值时保留重复元组是很重要的。假设Computer Science
系增加了第四位教师,其工资正好是75000美元。如果去除重复的话,我们会得到错误的答案(232000/4=58000美元),而正确的答案是76750美元。
使用distinct在计算聚集函数之前 删除重复元组
有些情况下在计算聚集函数前需先删掉重复元组。如果我们确实想删除重复元组,可在聚集表达式中使用关键词distinct
。比方有这样一个查询示例”找出在2010
年春季学期
讲授一门课程的教师
总数“,在该例中不论一个教师讲授了几个课程段,他只应被计算一次。所需信息包含在teaches
关系中,我们书写该查询如下
1 | select count(distinct ID) |
计算一个关系中元组的个数count(*)
我们经常使用聚集函数count
计算一个关系中元组的个数。SQL
中该函数的写法是count(*)
。因此,要找出course
关系中的元组数,可写成:
1 | select count(*) |
1 | mysql> select count(*) |
没有count(distinct *)
SQL
不允许在用count(*)
时使用distinct
。
max和min中可以使用distinct
在用max
和min
时使用distinct
是合法的,不过没有必要,因为结果并无差别
。
默认保留重复
我们可以使用关键词all
替代distinct
来说明保留重复元组,但是,既然all
是默认的,所以没必要显示使用all
。
原文链接: 3.7 聚集函数 3.7.1 基本聚集