@[TOC] 查询使用的数据库文件下载
聚集函数是以值的一个集合为输入、返回单个值的函数。SQL
提供了五个固有聚集函数:
- 平均值:avg
- 最小值:min
- 最大值:max
- 总和:sum
- 计数:count
sum和avg的输入必须是数字集,但其它运算符还可以作用在非数字数据类型的集合上;
1. 基本聚集
-
查找''Computer science''系的平均工资
select avg(salary) as avg_salary from instructor where dept_name='Comp.Sci.';
-
计算平均值时注意保留重复元祖,但某些情况需要删除重复元祖以进行聚集,如找出2010年春教授课程的老师数量
select count(distinct ID) from teaches where semester='Spring' and year=2010;
-
计算关系中元祖的个数:count(*)
2. 分组聚集
-
group by 子句
-
group by 子句给出的一个或多个属性是用来构造分组的,group by 子句中的所有属性上取值相同的元祖将被分在同一组;
- 例子:查找每个系的平均工资:
select dept_name,avg(salary) as avg_salary from instructor group by dept_name
- 当
SQL
查询使用分组时,注意保证出现在select语句中但没有被聚集的属性只能是出现在group by子句中的那些属性(即,任何没有出现在group by子句中的属性如果出现在select子句的话,它只能出现在聚集函数内部,否则这样的查询是错误的);
-
-
having子句
-
having:针对分组限定条件
-
例子:找出系平均工资超过42000美元的那些系中教师的平均工资
select dept_name,avg(salary) as avg_salary from instructor group by dept_name having avg(salary)>42000
- 任何出现在having语句中但没有被聚集的属性只能是出现在group by子句中的那些属性。
-
-
包含聚集、group by或having子句的查询的含义可通过下述操作序列来理解:
- 首先,from子句计算出关系;
- 如果出现where子句,则where子句筛选关系元祖;
- 如果出现group by子句,对经筛选的元祖分组;
- 如果出现having子句,筛选分组;
- 最后,执行select;
3. 对空值和布尔值的聚集:
-
假设instructor关系中某些元祖在salary上取空值,针对以下查询:
-
select sum(salary) from instructor
SQL标准并不认为总和为null,而是忽略求和的值集中的空值
-
-
聚集函数根据以下原则处理空值:除了count(*)外所有的聚集函数都忽略输入集合中的空值;
- 由于空值被忽略,可能造成参加聚集函数运算的输入集合为空,故规定空集count运算值为0,其它聚集运算在输入为空集时返回空值。
-
boolean:
- 使用 some 与 every 聚集函数;
References: [1] Abraham Silberschatz, Henry F Korth, S Sudarshan. Database System Concepts. New York: McGraw-Hill, 2010 Database System Concepts