2017-11-11MySQL中的where和having的区别

您现在的位置是: 首页 > MySQL技术 > MySQL中的where和having的区别

572次阅读

“where” 是一个约束声明,使用where来约束来之数据库的数据,where是在结果返回之前起作用的,且where中不能使用聚合函数。注意:返回结果集之前起作用

“having”是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在having中可以使用聚合函数。注意:返回结果集之后起作用

在查询过程中where子句、聚合语句、having子句,的执行优先级为where>group by>聚合语句(sum、count、avg、max、min)>having子句

where与having非常类似,都能筛选数据.表达式完全一致,但是职责不同,where负责对表中的字段进行筛选,having负责对where筛选后的结果集再次筛选。这也就是where不能使用别名字段来筛选的原因,因为数据中没有这个字段。

where筛选从磁盘的数据库中筛选后临时保存在内存中,然后having负责继续筛选,也就是说能用where的地方一定都能用having,反之,能用having的不一定能用where。尽管having也能处理where的任务,但是尽可能不要这样做,mysql官方是这样推荐的,或许是考虑性能

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

一、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的情况

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

#报错!!!因为前面并没有筛选出goods_price 字段


三、只可以用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 

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