一、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