07 | 条件语句:WHERE 与 HAVING有什么不同?
朱晓峰
你好,我是朱晓峰。
我们在进行查询的时候,经常需要按条件对查询结果进行筛选,这就要用到条件语句 WHERE 和 HAVING 了。
WHERE 是直接对表中的字段进行限定,来筛选结果;HAVING 则需要跟分组关键字 GROUP BY 一起使用,通过对分组字段或分组计算函数进行限定,来筛选结果。虽然它们都是对查询进行限定,却有着各自的特点和适用场景。很多时候,我们会遇到 2 个都可以用的情况。一旦用错,就很容易出现执行效率低下、查询结果错误,甚至是查询无法运行的情况。
下面我就借助项目实施过程中的实际需求,给你讲讲 WHERE 和 HAVING 分别是如何对查询结果进行筛选的,以及它们各自的优缺点,来帮助你正确地使用它们,使你的查询不仅能够得到正确的结果,还能占用更少的资源,并且速度更快。
一个实际查询需求
超市的经营者提出,要查单笔销售金额超过 50 元的商品。我们来分析一下这个需求:需要查询出一个商品记录集,限定条件是单笔销售金额超过 50 元。这个时候,我们就需要用到 WHERE 和 HAVING 了。
这个问题的条件很明确,查询的结果也只有“商品”一个字段,好像很容易实现。
假设我们有一个这样的商品信息表(demo.goodsmaster),里面有 2 种商品:书和笔。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
在MySQL中使用条件语句WHERE和HAVING是进行数据查询时的重要技术。本文通过实际案例和详细分析展示了它们的应用场景和执行原理。WHERE关键字适用于对数据集进行筛选,而HAVING需要与GROUP BY一起使用,对分组后的结果进行筛选。文章还介绍了它们的区别和适用场景,以及如何在查询中充分利用它们的优势。此外,作者还提醒读者,学会使用HAVING对完成复杂的查询任务非常有帮助。总的来说,本文通过实例和分析帮助读者正确理解和使用WHERE和HAVING,使查询结果正确且占用更少资源,速度更快。文章内容涵盖了WHERE和HAVING的特点、使用方法以及在实际查询中的应用,对读者快速了解和掌握这些技术特点具有指导意义。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 必知必会》,新⼈⾸单¥59
《MySQL 必知必会》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(18)
- 最新
- 精选
- 朱晓峰置顶你好,我是朱晓峰,下面我就来公布一下上节课思考题的答案: 上节课,我们学习了如何进行多表查询。下面是思考题的答案: 如果不能使用外键约束,你可以在应用层增加确保数据完整性的功能模块,比如删除主表记录时,增加检查从表中是否应用了这条记录的功能,如果应用了,就不允许删除。2021-04-2116
- 洛奇筛选条件放在ON或者WHERE子句中,都是一样的吧?
作者回复: ON后面的字句是连接条件,WHERE后面的子句才是筛选条件,不一样的
2021-03-3036 - 青雘有数据库的数据包吗 ? 这咋动手 没有数据
作者回复: 很抱歉数据包是不能提供的,可以自己动手创建数据,也是一种很好的练习
2021-07-134 - SharpBBWHERE 直接用表字段对数据集进行筛选 得到较少的数据集 再进行连接 资源占用少 执行效率高 HAVING 需要将数据准备好 并进行分组形成集合 再对该集合进行having条件的筛选 两者区别 1.where先筛选后连接 having先连接后筛选 where的效率更高 2.where可以直接用 而having必须和group by一起用才可以 3.可以在having中用函数 但where不行 所以having可以做一些更nb的查询
作者回复: 好的
2022-02-092 - hellosql语句的执行顺序,不是先执行join 再执行where吗?老师在提到where优点的时候说where的优点是先筛选在关联。这里似乎跟sql执行的顺序有了矛盾呢
作者回复: mysql优化器在制定查询计划的时候,会对查询进行优化,比如重写查询语句,目的是提高查询的速度效率,不会机械按照固定的顺序执行。
2021-07-121 - Cheesegroup by不是很理解,和having配合在一起使用有点懵了。
作者回复: group by是对数据进行分组,having则是对结果集进行限定,建议再复习一下课程中的相关内容
2022-02-15 - Bird老师您好,用 HAVING 查询单笔超过 50 元商品的 SQL 中,用到了 HAVING max(a.salesvalue)>50 这个 max() 我不太理解,是指在分组后对每个组中的 salesvalue 取最大值再和 50 比较吗? 这块不明白导致后面原文说的“第三步,对分组后的数据集进行筛选,把组中字段“salesvalue”的最大值 >50 的组筛选出来。”就更不明白了。 我的疑问是,需求是找到比 50 大的就好,不理解这里为什么用到求最大值。求的是哪些数据范围的最大值呢?
作者回复: 这里用max()的主要目的是,消除结果集中的重复记录。获得正确结果的方法不止一种,文中的查询主要是为了演示HAVING()的用法。
2021-10-223 - 彭彬HAVING 后面的条件,必须是包含分组中的计算函数的条件,或者select后面的字段
作者回复: 请参考思考题答案
2021-09-12 - born在“查询单笔销售金额超过 50 元的商品”例子中的第三步,GROUP BY只用goodsname字段结果只返回了组中的第一条数据,想要返回图示中的两条数据还要添加另外的字段吧
作者回复: 是的,由于2条记录的商品名称相同,用商品名称来分组,结果就是一条数据,如果分组中加上销售金额,就是2条数据了
2021-06-30 - 沈康有这样一种说法:HAVING 后面的条件,必须是包含分组中的计算函数的条件,你觉得对吗?为什么? 我认为是对的,既然 having是在group之后的筛选,那么只能选择group的计算函数
作者回复: 请参考思考题答案
2021-05-20
收起评论