题解 | #分组过滤练习题#

分组过滤练习题

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

select * from goods where goods_price>10

select * from goods having goods_price>10

这时候having和where都可以使用

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

1

2

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是针对数据库里的原始字段做条件限制

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

1

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

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

1

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

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

1

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

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

分组之后对统计结果进行筛选的话必须使用having,不能使用where

where子句用来筛选 FROM 子句中指定的操作所产生的行

group by 子句用来分组 WHERE 子句的输出。

having 子句用来从分组的结果中筛选行

  1. 书写顺序:

select–from–where–group by–having–order by

其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行

  1. 执行顺序

from–where–group by–having–select–order by,

from:需要从哪个数据表检索数据

where:过滤表中数据的条件

group by:如何将上面过滤出的数据分组

having:对上面已经分组的数据进行过滤的条件

select:查看结果集中的哪个列,或列的计算结果

order by :按照什么样的顺序来查看返回的数据

SQL错题 文章被收录于专栏

每天学习一遍 刷题刷题 越刷越强!

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务