3.7.3 having子句
3.7.3 having子句
having子句对分组起作用
SQL查询 找出教师平均工资超过42000美元的系
having子句中的没有被聚集的属性必须出现在group by子句中
查询子句顺序: 先from 再where 然后 group by 接着having 最后select 聚集
SQL查询 对于在`2009`年讲授的每个`课程段`,如果该课程段有至少2名学生选课,找出选修该课程段的所有学生的`总学分`(`tot_cred)`的`平均值`
having子句对分组起作用
SQL查询 找出教师平均工资超过42000美元的系
having子句中的没有被聚集的属性必须出现在group by子句中
查询子句顺序: 先from 再where 然后 group by 接着having 最后select 聚集
SQL查询 对于在`2009`年讲授的每个`课程段`,如果该课程段有至少2名学生选课,找出选修该课程段的所有学生的`总学分`(`tot_cred)`的`平均值`
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) |