MySQL HAVING用法

MySQL HAVING用法为聚合结果指定条件如果想要从GROUPBY分组中进行筛选的话,不是用WHERE而是使用HAVING来进行聚合函数的筛选。比如之前问过的问题,如何从商品分类汇总中找到条数为2的商品种类呢?1.HAVING子句HAVING子句写法:SELECT<列名1>,<列名2>,<列名3>,……FROM<表名>GROUPBY<列名1>,<列名2>,<列名3>,……HA

大家好,又见面了,我是你们的朋友全栈君。

为聚合结果指定条件

如果想要从 GROUP BY 分组中进行筛选的话,不是用 WHERE 而是使用 HAVING 来进行聚合函数的筛选。

比如之前问过的问题,如何从商品分类汇总中找到条数为2的商品种类呢?

MySQL HAVING用法

1. HAVING子句

HAVING 子句写法:

SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ……
HAVING <分组结果对应的条件>

HAVING 子句必须写在GROUP BY 子句之后,其在DBMS 内部的执行顺序也排在GROUP BY 子句之后。

使用HAVING 子句时SELECT 语句的顺序
SELECT → FROM → WHERE → GROUP BY → HAVING

1.1使用HAVING进行分组筛选

接下来就让我们练习一下HAVING 子句吧。例如,针对按照商品种类进行分组后的结果,指定“包含的数据行数为2 行”这一条件的SELECT 语句。

示例:查询商品分类条数汇总并将条数为2的商品提取出来

SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type
HAVING COUNT(*) = 2;

执行结果:

product_type | count
-------------+------
衣服         |  2
办公用品     |  2

1.2 对比不使用 HAVING 的情况下 SQL 语句执行的情况

示例:不使用HAVING进行条件筛选

SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type

执行结果:

product_type | count
-------------+------
衣服         |  2
办公用品     |  2
厨房用具     |  4

通过对比可以发现我们并没有将条数为2的数据筛选出来

2. HAVING的使用条件

HAVING和GROUP BY 类似,可以使用在HAVING里面的表达式:

  • 常数
  • 聚合函数
  • GROUP BY 指定的列名(即聚合键)

2.1 错误的使用HAVING

示例:错误使用HAVING

SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type
HAVING product_name = '圆珠笔';

执行结果:

ERROR: 列"product,product_name"必须包含在GROUP BY子句当中,或者必须在聚合函数中使用
行 4: HAVING product_name = '圆珠笔';

错误原因在于product_name这个字段既不是聚合函数,也没有包含在GROUP BY 指定列里面。所以报错。

如果想正确使用需要这么写:

示例:正确使用HAVING

SELECT
    product_type,
    COUNT(*)
FROM
    Product 
GROUP BY product_type
HAVING product_type = '衣服'

执行结果:

product_type | count
-------------+------
衣服         |  2

2.2 相对于 HAVING 更适合 WHERE 的语句

有些条件既可以写在 HAVING 子句当中,又可以写在 WHERE 子句当中。这些条件就是聚合键所对应的条件。原表中作为聚合键的列也可以在 HAVING 子句中使用。

**示例:既可以使用 HAVING 又可以使用 WHERE **

SELECT
    product_type,
    COUNT(*)
FROM
    Product 
WHERE product_type = '衣服'
GROUP BY product_type
-- HAVING product_type = '衣服'

执行结果:

product_type | count
-------------+------
衣服         |  2

2.3 什么时候用 WHERE 什么时候使用 HAVING 呢?

  • WHERE 子句 = 指定行所对应的条件
  • HAVING 子句 = 指定组所对应的条件
  • WHERE 处理速度比 HAVING 处理速度高
  • 聚合键所对应的条件不应该书写在 HAVING 子句当中,而应该书写在 WHERE 子句当中。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150476.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • PetShop4架构设计分析(三,四)

    PetShop4架构设计分析(三,四) petshop4.0详解之三(PetShop数据访问层之消息处理)三、PetShop数据访问层之消息处理在进行系统设计时,除了对安全、事务等问题给与足够的重视外,性能也是一个不可避免的问题所在,尤其是一个B/S结构的软件系统,必须充分地考虑访问量、数据流量、服务器负荷的问题。解决性能的瓶颈,除了对硬件系统进行升级外,软件设计的合理性尤为重要。在前面我曾提到,分层式结构设计可能会在一定

    2022年10月16日
  • Cinemachine学习笔记

    Cinemachine学习笔记以下都是转载内容,能够比较直观的学习一些基础内容。现在的Cinemachine更新了许多新的功能,但是Cinemachine插件都ExamplesScences,去看一下官方例子和文档来学习更佳*版本要求Unity2017.1及以上。参考资料: [官方]Unity2017.1正式版发布 Cinemachine插件:Cinemachine。 结合Timeline实现动画:Unity…

  • pycharm选中一行代码快捷键_python代码自动对齐

    pycharm选中一行代码快捷键_python代码自动对齐在写代码的时候,经常为了对齐代码而烦恼,强大的pycharm为我们提供了一个代码自动对齐功能,而且可以使用快捷键完成。快捷键组合是:Ctrl+Alt+L将光标置于需要调整的代码行,或者选择一个区域,按下快捷键,代码就可以自动对齐啦!…

  • 5个强大的Java分布式缓存框架_5个Java分布式缓存框架「建议收藏」

    5个强大的Java分布式缓存框架_5个Java分布式缓存框架「建议收藏」5个强大的Java分布式缓存框架1、Ehcache–Java分布式缓存框架Ehcache是一个Java实现的开源分布式缓存框架,EhCache可以有效地减轻数据库的负载,可以让数据保存在不同服务器的内存中,在需要数据的时候可以快速存取。同时EhCache扩展非常简单,官方提供的Cache配置方式有好几种。你可以通过声明配置、在xml中配置、在程序里配置或者调用构造方法时传入不同的参数。官方网…

  • FileSystemWatcher 类

    FileSystemWatcher 类命名空间:System.IO程序集:System.IO.FileSystem.Watcher.dll,System.dll,netstandard.dll侦听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。Listenstothefilesystemchangenotificationsandraiseseventswhenadirector…

  • win10无法识别的usb设备前一个设备不正常_蓝牙变成未知usb设备

    win10无法识别的usb设备前一个设备不正常_蓝牙变成未知usb设备[修复]未知的USB设备(设备描述符请求失败)在Windows10中转至[修复]未知的USB设备(设备描述符请求失败)在Windows10中

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号