最新文章
- MySQL中, group by 和 order by 一起使用会有排序问题,group by 和 order by 同时使用时要注意的地方
- Vue学习笔记(10) ——Vue组件中的data和methods
- Vue学习笔记(9) ——Vue组件创建的几种方式
- Vue学习笔记(8) ——Vue实例的生命周期
- Vue学习笔记(7) —— 过滤器 filter的基本使用
- Vue学习笔记(6) ——v-if指令和v-show指令
- Vue学习笔记(5) —— v-for指令和key属性
- Vue学习笔记(5) —— Vue中样式-class样式和style样式
- Vue学习笔记(4) —— v-model指令,双向数据绑定
- Vue学习笔记(3) —— Vue事件修饰符
关注我

在线咨询
x
有什么可以帮到你

点击咨询
MySQL中的where和having的区别
- 分类:MySQL技术
- 时间:2017-11-11
- 共806人围观
简介where与having非常类似,都能筛选数据.表达式完全一致。但是职责的确不同。where负责对表中的字段进行筛选,having负责对where筛选后的结果集再次筛选。这也就是where不能使用别名字段来筛选的原因,因为数据中没有这个字段。
“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只是根据前面查询出来的是什么就可以后面接什么。
下一篇:MySQL子句的查询陷阱