mysql中where与having的用法和区别

沃森博客 2017年10月14日00:15:35数据库评论444阅读模式

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

mysql中where与having的用法和区别

mysql中where与having的用法和区别

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

举例说明:

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

  1. select?goods_price,goods_name?from?sw_goods?where?goods_price?>?100
  2. 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的情况

  1. select?goods_name,goods_number?from?sw_goods?where?goods_price?>?100
  2. select?goods_name,goods_number?from?sw_goods?having?goods_price?>?100

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

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

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

  1. select?goods_category_id?,?avg(goods_price)?as?ag?from?sw_goods?group?by?goods_category?having?ag?>?1000
  2. 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子句是在排序之后才对数据进行分组的,因此与前者相比,需要排序的数据量就要多得多。

沃森博客
  • 本文由 发表于 2017年10月14日00:15:35
  • 本文来自互利网收集整理,问题反馈联系邮箱:wosnnet@foxmail.com,转载请务必保留本文链接:https://wosn.net/669.html

发表评论