从删库到跑路(4)

聚集函数:是以值的集合为输入,返回单个值得函数。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子句利用剩下的分组产生出查询结果中的元组,即在每个分组上应用聚集函数来单个结果元组
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值