题解 | 分组过滤练习题(方法1)

select
    university,
    round(avg(question_cnt), 3) as avg_question_cnt,
    round(avg(answer_cnt), 3) as avg_answer_cnt
from
    user_profile
group by
    university
having
    round(avg(question_cnt), 3) < 5
    or round(avg(answer_cnt), 3) < 20
# 一、【聚合函数结果作为筛选条件时,不能用where过滤,而是用having语法】
# 原因分析:
# 编写语句顺序的思路:严格遵循SQL语句执行顺序
# SQL语句执行顺序:FROM-ON-JOIN-WHERE-GROUP BY-WITH-HAVING-SELECT-DISTINCT-ORDER BY-LIMIT
# 在SQL语句执行顺序中先执行where语句后执行GROUP BY语句,即聚合函数的结果作为筛选条件时,where语句已经先执行完了,所以没办法再对聚合函数下的分组GROUP BY语句进行过滤,应该用 SQL语句执行顺序中排在靠后位置的HAVING语句进行过滤,此时会在执行GROUP BY分组语句后,对分组情况再进行筛选过滤。

# 二、【SQL语句执行顺序中,排在select语句执行顺序前的语句,在编写语句的字段名称时需要使用AS命名前的字段名称】
# 示例错误答案:having  question_cnt< 5 or answer_cnt < 20
# 原因分析:SQL语句执行顺序中,先执行having语句再执行select语句,在运行having语句时,select语句还没有执行对选取字段用AS的命名,所以在编写having语句的字段名称时需要使用AS命名前的字段名称

全部评论

相关推荐

吴offer选手:学到了,下次面试也放张纸在电脑上,不然老是忘记要说哪几个点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务