题解 | #分组过滤练习题#
分组过滤练习题
https://www.nowcoder.com/practice/ddbcedcd9600403296038ee44a172f2d
select university, round(avg(question_cnt),3) as avg_question_cnt, round(avg(answer_cnt),3) 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元的商品所有信息
1 2 |
|
这时候having和where都可以使用
2.2需要筛选出来价格>10元的商品名字和商品类型
1 2 |
|
这时候,会发现having会报错,原因是因为having是针对前面有提到的字段,然后进行条件限制。但是where是针对数据库里的原始字段做条件限制
这时候要达到同样效果的话,必须在前面加上相对应的字段
1 |
|
同时,由于having的这个特性,如果前面对字段起了别名,后面的having是可以直接使用别名来限制的 ,但是where不可以,只能采用数据库原有的数据字段
1 |
|
2.2需要筛选出来平均价格>10元的商品名字和商品类型
1 |
|
where 不能跟聚合函数限制做筛选,having可以实现
分组之后对统计结果进行筛选的话必须使用having,不能使用where
where子句用来筛选 FROM 子句中指定的操作所产生的行
group by 子句用来分组 WHERE 子句的输出。
having 子句用来从分组的结果中筛选行
- 书写顺序:
select–from–where–group by–having–order by
其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行
- 执行顺序
from–where–group by–having–select–order by,
from:需要从哪个数据表检索数据
where:过滤表中数据的条件
group by:如何将上面过滤出的数据分组
having:对上面已经分组的数据进行过滤的条件
select:查看结果集中的哪个列,或列的计算结果
order by :按照什么样的顺序来查看返回的数据
每天学习一遍 刷题刷题 越刷越强!