MySQL 必知必会
朱晓峰
前摩根大通银行技术部副总裁、系统架构师
17746 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
MySQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

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
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • 朱晓峰
    置顶
    你好,我是朱晓峰,下面我就来公布一下上节课思考题的答案: 上节课,我们学习了如何进行多表查询。下面是思考题的答案: 如果不能使用外键约束,你可以在应用层增加确保数据完整性的功能模块,比如删除主表记录时,增加检查从表中是否应用了这条记录的功能,如果应用了,就不允许删除。
    2021-04-21
    1
    6
  • 洛奇
    筛选条件放在ON或者WHERE子句中,都是一样的吧?

    作者回复: ON后面的字句是连接条件,WHERE后面的子句才是筛选条件,不一样的

    2021-03-30
    3
    6
  • 青雘
    有数据库的数据包吗 ? 这咋动手 没有数据

    作者回复: 很抱歉数据包是不能提供的,可以自己动手创建数据,也是一种很好的练习

    2021-07-13
    4
  • SharpBB
    WHERE 直接用表字段对数据集进行筛选 得到较少的数据集 再进行连接 资源占用少 执行效率高 HAVING 需要将数据准备好 并进行分组形成集合 再对该集合进行having条件的筛选 两者区别 1.where先筛选后连接 having先连接后筛选 where的效率更高 2.where可以直接用 而having必须和group by一起用才可以 3.可以在having中用函数 但where不行 所以having可以做一些更nb的查询

    作者回复: 好的

    2022-02-09
    2
  • hello
    sql语句的执行顺序,不是先执行join 再执行where吗?老师在提到where优点的时候说where的优点是先筛选在关联。这里似乎跟sql执行的顺序有了矛盾呢

    作者回复: mysql优化器在制定查询计划的时候,会对查询进行优化,比如重写查询语句,目的是提高查询的速度效率,不会机械按照固定的顺序执行。

    2021-07-12
    1
  • Cheese
    group 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-22
    3
  • 彭彬
    HAVING 后面的条件,必须是包含分组中的计算函数的条件,或者select后面的字段

    作者回复: 请参考思考题答案

    2021-09-12
  • born
    在“查询单笔销售金额超过 50 元的商品”例子中的第三步,GROUP BY只用goodsname字段结果只返回了组中的第一条数据,想要返回图示中的两条数据还要添加另外的字段吧

    作者回复: 是的,由于2条记录的商品名称相同,用商品名称来分组,结果就是一条数据,如果分组中加上销售金额,就是2条数据了

    2021-06-30
  • 沈康
    有这样一种说法:HAVING 后面的条件,必须是包含分组中的计算函数的条件,你觉得对吗?为什么? 我认为是对的,既然 having是在group之后的筛选,那么只能选择group的计算函数

    作者回复: 请参考思考题答案

    2021-05-20
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部