mysql where 与having_mysql中where与having的用法和区别

having是用来弥补where在分组数据判断时的不足。having 和where 都是用来筛选用的,where针对表中的列发挥作用,查询数据。having是对查询结果中得到的列发挥作用,筛选数据(也就是说从查询出的结果集再次进行筛选)。

a1dcf606d57f74b3f8160b77e0d49e5d.png

mysql中where与having的用法和区别

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

举例说明:

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

select?goods_price,goods_name?from?sw_goods?where?goods_price?>?100

select?goods_price,goods_name?from?sw_goods?having?goods_price?>?100

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

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

select?goods_name,goods_number?from?sw_goods?where?goods_price?>?100

select?goods_name,goods_number?from?sw_goods?having?goods_price?>?100

having语句会报错!!!因为前面并没有筛选出goods_price 字段。

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

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

where语句会报错!!因为sw_goods 这张数据表里面没有ag这个字段。

注意:where 后面要跟的是数据表里的字段,如果我把ag换成avg(goods_price)也是错误的!因为表里没有该字段。而having只是根据前面查询出来的是什么就可以后面接什么。

总结

where 字句使用必须是数据表中存在的字段,having子句使用必须是select语句查询出来的字段可以使用。

延伸拓展

having子句可以让我们筛选成组后的各种数据,having子句在查询过程中慢于聚合语句(sum,min,max,avg,count)。而where子句在查询过程中则快于聚合语句(sum,min,max,avg,count),因为where执行优先级别要高于聚合语句。

所以在Where子句和Having子句中都可以使用的条件,从语句的执行效率来看,最好是用Where子句。

因为在使用聚合函数对表中的数据进行聚合操作时,DBMS内部会进行排序处理,而排序操作会增加机器的负担,减少排序的行数,可以增加处理速度。

使用Where子句指定条件时,由于排序之前就对数据进行了过滤,所以能够减少排序的数据量。但是Having子句是在排序之后才对数据进行分组的,因此与前者相比,需要排序的数据量就要多得多。

历史上的今天:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值