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)


相关推荐

  • SecureCRT 设置超时自动断开连接时长

    SecureCRT 设置超时自动断开连接时长SecureCRT 设置超时自动断开连接时长

  • Spring StoredProcedure调用Oracle函数各种异常解决方法

    Spring StoredProcedure调用Oracle函数各种异常解决方法其实也不是各种异常解决方法,只是出现了太多的异常我实在不知道有哪些,下面列举一下吧:1.PLS-00306:wrongnumberortypesofargumentsincallto’QUERYUSER’ORA-06550:line1,column7:PL/SQL:Statementignored原因:这个问题是少参数,或者类型不对,我的原因是函数的…

  • SAE J1939 – 简短介绍[通俗易懂]

    SAE J1939 – 简短介绍[通俗易懂]SAEJ1939–简短介绍在商用车辆领域,标准化的,串行的协议用于单个电子控制单元(ECU)和传动系统组件之间的通讯已有一段时间。通过使用标准化的串行协议,可具有以下优势:组件制造商只需要采用一个协议;这主要是商用车辆才会涉及的问题,因为生产量低。商用车辆制造商可依靠不同供应商的组件。可确保组件之间的互操作性,来自不同制造商的组件不用调整就可一同工作。由国际汽车工程师协会…

  • printwriter写入文件_java socket编程

    printwriter写入文件_java socket编程2015-02-2006:30:01阅读(1843)下面示例代码演示使用PrintWriter方法写文件。PrintWriter的构造函数接受FileWriter作为参数。得到PrintWriter实例之后调用其println()方法即可写入字符串。importjava.io.FileWriter;importjava.io.IOException;importjava.io.Prin…

  • Python自动化测试面试题及答案(持续更新中)

    1、自动化代码中,用到了哪些设计模式?单例设计模式工厂模式PO设计模式数据驱动模式面向接口编程设计模式2、什么是断言(Assert)?断言Assert用于在代码中验证实际结果是不是符合预期结果,如果测试用例执行失败会抛出异常并提供断言日志3、什么是web自动化测试Web自动化测试是从UI(用户界面)层面进行的自动化测试测试人员通过编程自动化程序(测试用例脚本)来打开浏览器测试网站的业务逻辑4、什么是seleniumSelenium是一个开源的web自动化测试框架,支持

  • 怎么把已有的RSA公私钥转换成PKCS8格式

    怎么把已有的RSA公私钥转换成PKCS8格式

发表回复

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

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