MySQL中 where和having的区别

误区:不要错误的认为having和group by 必须配合使用。

下面以一个例子来具体的讲解:

1. where和having都可以使用的场景

    select goods_price,goods_name from sw_goods where goods_price > 100
 
 
  • 1
        select goods_price,goods_name from sw_goods having goods_price > 100
 
 

解释:上面的having可以用的前提是我已经筛选出了goods_price字段,在这种情况下和where的效果是等效的,但是如果我没有select goods_price 就会报错!!因为having是从前筛选的字段再筛选,而where是从数据表中的字段直接进行的筛选的。

2. 只可以用where,不可以用having的情况

    select goods_name,goods_number from sw_goods where goods_price > 100
 
 
  • 1
    select goods_name,goods_number from sw_goods having goods_price > 100 //报错!!!因为前面并没有筛选出goods_price 字段
 
 
  • 1

3. 只可以用having,不可以用where情况

查询每种goods_category_id商品的价格平均值,获取平均价格大于1000元的商品信息

    select goods_category_id , avg(goods_price) as ag from sw_goods group by goods_category having ag > 1000
 
 

    从整体声明的角度来理解:

    Where是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能使用聚合函数

    Having是一个过滤声明,所谓过滤是在查询数据库的结果返回之后进行过滤,即在结果返回之后起作用,并且having后面可以使用聚合函数。

    所谓聚合函数,是对一组值进行计算并且返回单一值的函数:sum—求和,count—计数,max—最大值,avg—平均值等。

    总结:
    1.Where和Having的作用对象不同:WHERE 子句作用于表和视图,HAVING 子句作用于组。

    2.WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。因此,WHERE 子句不能包含聚集函数; 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。 相反,HAVING 子句总是包含聚集函数。

    3.having一般跟在group by之后,执行记录组选择的一部分来工作的。
    where则是执行所有数据来工作的。
    再者having可以用聚合函数,如having sum(qty)>1000

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

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

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

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值