where、having的区别和用法

聚合函数是比较where、having的关键

where、聚合函数、having在from后面的执行顺序:

where > 聚合函数(sum、min、max、avg、count)> having

简单来说,where先执行,再执行聚合函数,再执行having

①where 是一个约束声明,即在返回结果之前起作用,而且在where条件后面不能使用聚合函数。因为where的优先级大于聚合函数。

错误语句:select  sum(t.score) from student  t group by t.sex where sum(t.age)>100;(在where之后使用了聚合函数)

②having是一个过滤声明,即在返回结果之后对查询结果进行过滤,在having条件后面可以使用聚合函数。因为聚合函数的优先级大于having。其次,having是对查出来的结果进行过滤,所以没有查出来的结果不能进行过滤

错误语句:select  t.id,t.name from student t having t.score >90;(只查询了id,name,但是having过滤score)

一、where、having都可以使用的情况

正确语句:select t.id, t.name , t.age  from student t where t.age > 22

正确语句:select t.id ,t.name , t.age from student t having t.age > 22

都是查询年龄大于22岁的人的资料,因为查询了id 、name 、age,所以用having可以删选age

二、只可以用where,不可以用having 的情况

正确语句:select t.id, t.name from student t where t.age > 22

错误语句:select t.id ,t.name from student t having t.age > 22       (错误的)

where查询了年龄大于22岁的人的资料,语句2中,只查询了id,name,没有查询age,所以having中不能用age来筛选!

三、只可以用having,不能用where的情况

having是分组(group by)后的筛选条件,分组后的数据组内再筛选;where则是在分组前筛选。

正确语句:select t.id , t.name , avg(t.age) as ag from student  t group by id , name having ag >22

错误语句:select t.id , t.name , avg(t.age) as ag from student t where ag > 22 group by id, name

因为where的优先级大于聚合函数,所以实质上是没有执行 avg(t.age) as ag ,所以where条件不成立,执行错误。

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值