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 子句当中。

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 怎么倍速看百度云视频(火狐浏览器百度云倍速)

    控制台调控videojs.getPlayers(“video-player”).html5player.tech_.setPlaybackRate(2)

    2022年4月16日
    94
  • 深入db4o

    深入db4o这是RickGrehan发表在TheServerSide上的一篇关于面向对象数据库–db4o的文章,较全面地介绍了db4o的关键特性,希望对大家认识db4o能有所帮助。(2007.12.07最后更新)   db4o-针对对象的数据库-是一个完全的对象数据库;它以使对象在其生命周期中-无论是在数据库内或是在外-都保持着它们的本性这样一种方式操纵对象。不论类的复杂性如何,对象的内容,结构

    2022年7月21日
    16
  • 特殊符号心形_wps中斜杠怎么做

    特殊符号心形_wps中斜杠怎么做加帽子符号latex中如果想在字母上加上一个帽子(尖角)符号应该怎样表达呢?(1)如果是在正文中,例如用\^{Z}即可;(2)如果是在公式中,例如用\hat{Z}即可。加横线和波浪线加^号输入\hat 或\widehat加横线输入\overline加波浪线输入\widetilde加一个点\dot{要加点的字母}加两个点\ddot{要加点的字母}其…

    2025年7月4日
    3
  • SSL及其加密通信过程「建议收藏」

    SSL及其加密通信过程「建议收藏」SSL协议和加密过程一、什么是SSL二、HTTPS和SSL三、SSL加密方式3.1对称加密与非对称加密3.1.1对称加密3.1.2非对称加密3.2具体的加密过程一、什么是SSLSSL英文全称SecureSocketLayer,安全套接层,是一种为网络通信提供安全以及数据完整性的安全协议,它在传输层对网络进行加密。它主要是分为两层:SSL记录协议:为高层协议提供安全封装、压缩、加密等…

    2022年6月3日
    44
  • 版本控制——总结[通俗易懂]

    版本控制——总结[通俗易懂]1.定义版本控制(Revisioncontrol)是一种软体工程技巧,籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新。2.原理版本控制透过文档控制(documentationco

    2022年8月2日
    4
  • 微表情识别

    表情识别2019.12更新了仓库依赖。简介使用卷积神经网络构建整个系统,在尝试了Gabor、LBP等传统人脸特征提取方式基础上,深度模型效果显著。在FER2013、JAFFE和CK+三个表情识别数据集上进行模型评估。环境部署基于Python3和Keras2(TensorFlow后端),具体依赖安装如下(推荐使用conda或者venv虚拟环境)gitclonehttp…

    2022年4月9日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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