聚集函数:是以值的集合为输入,返回单个值得函数。SQL提供了5个固有的聚集函数。
- 平均值:avg
- 最小值:min
- 最大值:max
- 求和:sun
- 计数:count
–基本聚集
比如说,’找出‘Computer science’系教师的平均工资‘
select avg(salary) from instructor where dept_name='Com.sci'
这个查询结果是只有一个单属性的关系,其中只包含一个元组,这个元组的值对应于‘Computer science’系教师的平均工资,数据库系统可以给结果关系的属性任意一个名字,可以用as子句给属性做更名运算
select avg(salary) as avg_salary from instructor where dept_name='Com.sci'
–分组聚集
有时候我们希望将聚集函数不止应用于单个元组集上,而且也将其作用到一组元组集上,在SQL中可用group by 子句实现。在group by 子句中,所有属性值上取值相同的元组将被分在同一组。
比如说,查询’每个系的平均工资‘
select dept_name,avg(salary) as avg_salary from instructor group by dept_name;
如果说把此查询改为’查询每个教师的平均工资‘
则可用下面的查询语句实现:
select avg(salary) from instructor
这个没有用group by子句,因此整个关系被当作是一个分组
当SQL查询使用分组时,一个很重要的事就是需要保证,任何没有出现在group by子句中的属性只能出现在聚集函数内部,否则这样的查询结果就是错误的。比如说
/
* 错误查询 */
select dept_name, id, avg(salary) from instructor group by dept_name
因为id没有出现在group by子句中,但它出现在了select查询语句中而没有被聚集。
–having子句:对分组的限定条件
比如说,查询’教师平均工资超过10000的系‘
select dept_name,avg(salary) as avg_salary
from instructor
group by dept_name
having avg(salary)>1000;
having子句的谓词在形成分组之后才起作用,因此可以使用聚集函数。
必须注意的是,任何出现在having子句中,但没有被聚集的属性必须出现在group by子句中。
包含聚集,group by,having子句的查询可以用以下操作序列:
- 最先根据from子句来计算出一个关系
- 如果出现where子句,where子句中的谓词将应用到from子句的结果关系上
- 如果出现了group by子句,满足where谓词的元组通过group by分组,如果没有出现group by子句,则where谓词的整个元组集被当作是一个元组
- 如果出现having子句,它将应用到每个分组上,不满足having子句谓词的分组将被抛弃
- select子句利用剩下的分组产生出查询结果中的元组,即在每个分组上应用聚集函数来单个结果元组