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命名前的字段名称