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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 快速提升网站排名_使用快排优化的方法「建议收藏」

      确定自己网站适不适合做快排  好多小伙伴想为自己网站做一做快排,但是又不知道自己网站适不适合,首先,大家都知道选好关键词的重要性,想实现投入和产出的最大化,建设网站前选好合适的关键词是非常必要的。找到网站合适的关键词,根据难度将关键词进行分类,布局对应的页面,核心关键词布局到首页,常用关键词分布列表页或栏目页,长尾关键词则主要出现在内容页。良好的网站结构是这整个网站构建的核心体系。一个良好的网站框架能让排名效果事半功倍,想要被搜索引擎快速收录的前提是可以让蜘蛛排名与抓取,而蜘蛛喜欢得是目录层次简单

    2022年4月15日
    51
  • Python 3 读取和存储Excel数据(应用到接口测试)

    Python 3 读取和存储Excel数据(应用到接口测试)1、利用cmd命令安装第三方库openpyxl同时支持读写操作,支持的Excel是以.xlsx结尾的文件。命令:pipinstallopenpyxl【命令:pipinstallreq

    2022年7月5日
    26
  • 安卓端口占用_查看端口号命令

    安卓端口占用_查看端口号命令android查看端口号被占用

    2022年7月27日
    5
  • 为何把2点半比作是神奇的2点半? 为什么炒股的人叫14:30分,叫神奇的2点[通俗易懂]

    为何把2点半比作是神奇的2点半? 为什么炒股的人叫14:30分,叫神奇的2点[通俗易懂]为何把14:30分称作神奇的2点半?为什么炒股的人叫14:30分,叫神奇的2点半?这个得从头开始说起!第一个是早盘:9:30-9:50,请一般散户不要参与!这是主力展示盘口语言的时间段,自认为水平

    2022年7月1日
    29
  • Jenkins(8)构建触发器之定时构建和轮询 SCM[通俗易懂]

    Jenkins(8)构建触发器之定时构建和轮询 SCM[通俗易懂]前言跑自动化用例每次用手工点击jenkins出发自动化用例太麻烦了,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行。jenkins的定时任务是用的crontab语法定时构建语法

    2022年7月29日
    13
  • anycast RP「建议收藏」

    anycast RP「建议收藏」动态RP尽管较静态RP有一定的优点,但依旧存在缺陷,当选定了RP后,所有的流量仅仅依靠这一个RP转发组播数据流量,不能实现流量负载功能。anycastRP场景:为了增强PIM-SM中RP节点的可靠性,以及对网络中的组播流量进行分担,可在网络中选取若干RP点,运行AnycastRP,达到冗余备份,负载分担的目的。原理:多个RP配置一个相同的AnycastRP地址…

    2022年5月24日
    43

发表回复

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

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