MySQL中where与having的关系与区别

浏览网页对这个问题有了深入的理解,主要参考了如下两个链接,得到的结论是:区别在于功能和性能两个方面,链接1对功能描述比较详细,链接2主要从性能角度进行解释。

链接1——where与having的区别
具体区别
1、Where 是一个约束声明,使用Where约束来自数据库的数据,Where是在结果返回之前起作用的,Where中不能使用聚合函数。
2、Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。
3、在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行。而where子句在查询过程中执行优先级高于聚合语句。

详细解释
大致解释如下,sql语句的执行过程是:from >where >group by >having > select >order by
聚合函数是针对结果集进行的,但是where条件并不是在查询出结果集之后运行,所以聚合函数放在where语句中,会出现错误,(据我的经验on子句中也不可以用聚集函数)。而having不一样,having是针对结果集做筛选的,所以我们一般把聚合函数放在having中,用having来代替where,having一般跟在group by后。

给出一个例子,在下面的查询语句中,只有在Order By语句中才可以使用最终视图的列名,如:
SELECT FruitName, ProductPlace, Price, ID AS IDE, Discount
FROM T_TEST_FRUITINFO
WHERE (ProductPlace = N’china’)
ORDER BY IDE
这里只有在ORDER BY语句中才可以使用IDE,其他条件语句中如果需要引用列名则只能使用ID,而不能使用IDE,这就体现了执行顺序

我对这个查询的解释是:
由于执行顺序是,from, where, group by,having,select, order by ,所以在order by中直接使用别名IDE的更详细原因是因为order by在select的之后执行。

链接2——为何where用的比having多?
在功能上,Where 子句能做的,Having 子句基本上都能做。唯一的差别是 Where 子句用来过滤行,而 Having 子句用于过滤分组。当存在分组操作时,Where 子句在数据分组前过滤,Having 子句在数据分组后进行过滤。
在性能方面,对于索引字段,放在 Where 子句中能有索引,而放在 Having 子句中不能走索引。请看下面这个例子:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值