为聚合结果指定条件

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

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

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

SELECTproduct_type,COUNT(*)
FROMProduct
GROUP BY product_type
HAVING product_type = '衣服'

执行结果:

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

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

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

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

SELECTproduct_type,COUNT(*)
FROMProduct
WHERE product_type = '衣服'
GROUP BY product_type
-- HAVING product_type = '衣服'

执行结果:

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

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

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

MySQL HAVING用法相关推荐

  1. mysql存储过程知识点_知识点:Mysql 基本用法之存储过程

    存储过程 一. 介绍 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql 使用存储过程的优点: 用于替代程序写的SQL语句,实现程序与sql ...

  2. mysql高级用法(函数)

    mysql 高级用法 # CONCAT 函数用于将两个字符串连接为一个字符串 SELECT CONCAT(businfo_name,businfo_creditCode) FROM tb_businf ...

  3. Mysql Explain用法pdf

    <Mysql Explain用法pdf> 下载地址:网盘下载 转载于:https://www.cnblogs.com/long12365/p/9731040.html

  4. Mysql limit用法

    MYSQL limit用法 1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. Sql代 ...

  5. c语言中limit 用法,mysql limit用法及优化详解

    摘要 腾兴网为您分享:mysql limit用法及优化详解,一点万象,喜马拉雅,唯品会,图乐等软件知识,以及盟重土城花屏补丁,宝马车主俱乐部,本地文件搜索,锁定刷新率,发券,微信多开真正版,云门禁,真 ...

  6. 企业级高性能MYSQL的用法---------(二)----------半同步复制 和 全同步复制(组复制)

    企业级高性能MYSQL的用法---------(二)----------半同步复制 和 全同步复制(组复制) 1.基于GDIT的半同步复制 为什么要实现mysqI的复制 1.实现服务器负载均衡 2.通 ...

  7. mysql explain 实例_Mysql实例mysql explain用法学习

    <Mysql实例mysql explain用法学习>要点: 本文介绍了Mysql实例mysql explain用法学习,希望对您有用.如果有疑问,可以联系我们. 导读:本节内容:mysql ...

  8. mysql as用法_MySQL基础学习总结

    数据分析无法离开SQL这一重要的工具,经过十天时间的学习,并完全以MySQL工具对上一节的数据分析岗位数据进行了分析,加强了操作训练,对这一工具使用有了基本的经验.本着以输出为手段检验学习效果,以温故 ...

  9. mysql $的用法_MYSQL limit用法

    1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. Sql代码   SELECT * F ...

  10. mysql count() 写法,MySQL COUNT()用法及代碼示例

    COUNT()功能: MySQL中的此函數用於查找從所選查詢返回的索引數. 特征: 此函數用於查找從所選查詢返回的索引數. 此功能在數字功能下. 此函數僅接受一個參數,即表達式. 此函數將忽略NULL ...

最新文章

  1. CVD和ALD薄膜沉积技术应用领域
  2. 阿里云rds linux平台使用wget 工具下载备份与日志文件
  3. antv g2字体阴影_antv g2的理解总结
  4. Rafy 框架 - 大批量导入实体
  5. 盘点2020国内本科开设人工智能专业高校
  6. 单点登录Redis存储Session及SessionId问题说明与集群实战-3
  7. react connect
  8. 【bfs】WZK旅游(jzoj 1996)
  9. 华为澳大利亚大动作,终止4.9亿投资;iPhone 12 或10月13日发布;Swift正式登陆Win 10 | 极客头条...
  10. nmcli管理网络 RHEL8和CentOS8怎么重启网络
  11. ajax只请求一次,关于ajax的请求只处理一次的问题
  12. Android中AndFix使用
  13. python教程 马哥_马哥python从入门到精通,资源教程下载
  14. visio教程仓库流程图_教你使用visio 2013绘制产品流程图
  15. pytorch求STFT
  16. MacOS 系统安装超详细教程
  17. Creo9.0 绘制中心线
  18. 【C语言】实现简单的计算器
  19. 11、每日最新新闻接口,免费好用
  20. 派大星python代码_一些简单的python例子

热门文章

  1. Java如何读取txt文件的内容?
  2. 王者荣耀登录显示换服务器是不是封号,王者荣耀:更改登录画面等于开挂?小心封号!...
  3. 华为技能鉴定java_华为Java笔试题
  4. js中箭头函数和普通函数区别
  5. 数据可视化第1篇:数据可视化的介绍
  6. Unity Window触摸屏电脑和移动端Input触控,控制相机旋转缩放
  7. Linux 修改时区和更新时间
  8. 大学校园里的十种傻学生
  9. VUE中使用geetest滑动验证码
  10. Python----静态变量