一、SQL答案

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
avg_question_cnt<5  or
avg_answer_cnt<20

二、解题思路&补充知识

1、这题考的是having函数的用法

当聚合条件作为筛选结果时,不可以使用where函数,要使用having函数

2、having和where的区别

假设有goods_name,goods_price,goods_type三个字段,表为:goods

2.1需要筛选出来价格>10元的商品所有信息

select * from goods where goods_price>10
select * from goods having goods_price>10

这时候having和where都可以使用

2.2需要筛选出来价格>10元的商品名字和商品类型

select goods_name,goods_type from goods where goods_price>10
select goods_name,goods_type from goods having goods_price>10(会报错!!!)

这时候,会发现having会报错,原因是因为having是针对前面有提到的字段,然后进行条件限制。但是where是针对数据库里的原始字段做条件限制

这时候要达到同样效果的话,必须在前面加上相对应的字段

select goods_name,goods_type,goods_price from goods having goods_price>10

同时,由于having的这个特性,如果前面对字段起了别名,后面的having是可以直接使用别名来限制的 ,但是where不可以,只能采用数据库原有的数据字段

select goods_name,goods_type,goods_price as price from goods having price>10

2.2需要筛选出来平均价格>10元的商品名字和商品类型

select goods_name,goods_type,avg(goods_price)  from goods having avg(goods_price)>10

where 不能跟聚合函数限制做筛选,having可以实现

3、having的执行语句顺序

select——from——where——group by——having

原始版本代码(问题:不会用having函数)
select
university,
round(avg(question_cnt),3) AS avg_question_cnt,
round(AVG(answer_cnt),3) as avg_answer_cnt
FROM
user_profile
where 
avg_1<5  or
avg_2>20

select
(
avg(question_cnt) as avg_1
avg(answer_cnt) as avg_2)
FROM
user_profile

GROUP BY 
university