3.7.3 having子句
有时候,对分组限定条件比对元组限定条件更有用。例如,我们也许只对教师平均工资超过42000美元的系感兴趣。该条件并不针对单个元组,而是针对group by
子句构成的分组。为表达这样的查询,我们使用SQL
的having
子句。
having子句对分组起作用
having
子句中的谓词在形成分组后才起作用,因此可以使用聚集函数。
SQL查询 找出教师平均工资超过42000美元的系
我们用SQL
表达该查询如下:
1 | select dept_name, avg(salary) as avg_salary |
1 | mysql> select dept_name, avg(salary) as avg_salary |
having子句中的没有被聚集的属性必须出现在group by子句中
与select
子句的情况类似,任何出现在having
子句中,但没有被聚集的属性必须出现在group by
子句中,否则查询就被当成是错误的。
查询子句顺序: 先from 再where 然后 group by 接着having 最后select 聚集
包含聚集
、 group by
或having
子句的查询的含义可通过下述操作序列来定义:
- 与不带聚集的查询情况类似,最先根据
from
子句来计算出一个关系。 - 如果出现了
where
子句,where
子句中的谓词将应用到from
子句的结果关系上。 - 如果出现了
group by
子句,满足where
谓词的元组通过group by
子句形成分组
。如果没有group by
子句,满足where
谓词的整个元组集被当作一个分组
。 - 如果出现了
having
子句,它将应用到每个分组上;不满足having
子句谓词的分组将被抛弃。 select
子句利用剩下的分组产生出查询结果中的元组,即在每个分组上应用聚集函数来得到单个结果元组。
SQL查询 对于在2009
年讲授的每个课程段
,如果该课程段有至少2名学生选课,找出选修该课程段的所有学生的总学分
(tot_cred)
的平均值
为了说明在同一个查询中同时使用having
子句和where
子句的情况,我们考虑查询”对于在2009
年讲授的每个课程段
,如果该课程段有至少2名学生选课,找出选修该课程段的所有学生的总学分
(tot_cred)
的平均值
“。
1 | select course_id, semester, year, sec_id, avg(tot_cred) |
1 | mysql> select course_id, semester, year, sec_id, avg(tot_cred) |
原文链接: 3.7.3 having子句