HAVING 子句

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。

HAVING 子句可以让我们筛选分组后的各组数据。往往与 GROUP BY 配合使用,为聚合操作指定条件, WHERE 子句只能指定行的条件,而不能指定组的条件,因此就有了 HAVING 子句,它用来指定组的条件。我们来看个具体示例就清楚了。

SQL HAVING 实例

我们拥有下面这个 "Orders" 表:

现在,我们希望查找订单总金额少于 2000 的客户。

我们使用如下 SQL 语句:

SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter

结果集类似:

Customer SUM(OrderPrice)
Carter 1700

现在我们希望查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额。

我们在 SQL 语句中增加了一个普通的 WHERE 子句:

SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500

结果集:

Customer SUM(OrderPrice)
Bush 2000
Adams 2000

HAVING 子句的构成要素

既然 HAVING 操作的对象是组,那么其使用的要素是有一定限制的,能够使用的要素有 3 种:常数 、 聚合函数 和 聚合键 ,聚合键也就是 GROUP BY 子句中指定的列名

示例中的 HAVING COUNT(*) = 3 , COUNT(*) 是聚合函数,3 是常数,都在 3 要素之中;如果有 3 要素之外的条件,会是怎么样呢

SELECT cno, COUNT(*) nums FROM tbl_student_class GROUP BY cno HAVING cname = '影视9班';

执行如上 SQL 会失败,并提示:

[Err] 1054 - Unknown column 'cname' in 'having clause'

在使用 HAVING 子句时,把 GROUP BY 聚合后的结果作为 HAVING 子句的起点,会更容易理解;示例中通过 cno 进行聚合后的结果如下:

聚合后的这个结果并没有 cname 这个列,那么通过这个列来进行条件处理,当然就报错了啦

细心的小伙伴应该已经发现,HAVING 子句的构成要素和包含 GROUP BY 子句时的 SELECT 子句的构成要素是一样的,都是只能包含 常数 、 聚合函数 和 聚合键

https://mp.weixin.qq.com/s/46woqFA6VscqairFsGWXcQ

SQL 之 HAVING相关推荐

  1. java 必备面试必备

    1.JDK 和 JRE 有什么区别? JDK(Java Development Kit),Java开发工具包 JRE(Java Runtime Environment),Java运行环境 JDK中包含 ...

  2. sql特殊字符转义,oracle中将字符 ‘ 转义

    oracle中使用sql语句或多或少地会遇到使用特殊字符,比如" ' ",这时,这个单引号就会与前面的单引号匹配,将文本从中间断开,引发问题和错误.这就需要我们进行转义. 而ora ...

  3. weblogic项目java.sql.SQLException: ORA-01861: 文字与格式字符串不匹配 at oracle.jdbc.....错误解决

    原因:数据源配置时间格式问题 解决方案: 1.进入weblogic控制台 2.左侧菜单栏选择Service- JDBC- Data Source 3.选择你的数据源,然后进入Configuration ...

  4. 如何定位并优化慢查询Sql

    根据慢日志定位慢查询SQL. 查询慢日志相关变量,并进行设置: 主要关注下述三个变量: long_query_time.show_query_log_file.show_query_log 慢查询sq ...

  5. Go 学习笔记(55)— Go 标准库 sql (初始化数据库、插入、更新、删除数据库表、单行查询、多行查询、事务处理)

    1. 标准库说明 Go 的标准库中是没有数据库驱动,只提供了驱动接口,有很多第三方实现了驱动,我们这里选择 go-sql-driver 这个实现是目前使用最多的.github 地址是:https:// ...

  6. SQL与NoSQL的区别 以MySQL与MongoDB为例

    异同对比 1.语言和结构层面 SQL数据库,是基于表的,并且用结构化语言也就是SQL来定义和操纵数据.一方面,这是非常强大的:SQL是最通用和最广泛使用的选项之一,使其成为一个安全的选择,尤其适用于复 ...

  7. 【Sql Server】数据库的3大服务

    在数据库SQL SERVER中,处理常用的sql server数据库引擎,还有其他3大服务,分别是集成服务,报表服务,分析服务. 集成服务商可以配置包,这里的包可以理解是数据库引擎里的用户数据库.可以 ...

  8. 【Sql Server】DateBase-自动化

    强大的SQL Server有着神奇的自动化功能,来处理一些人为处理不了的事情! 自动化功能:T-sql语言,系统命令.脚本语言.复制命令.创建角色.索引重建.报表 管理元素:作业.警报.操作员.计划 ...

  9. 【Sql Server】DateBase-触发器

    触发器是数据库中一种特殊的对象,当使用触发器时,一旦执行某个操作,就会触发执行的一段代码! 语法: Create trigger 名 On[table|view] { For after instea ...

  10. 【Sql Server】Database-存储过程

    存储过程是实现编写好的一组特定语言,用来实现的特定功能! 创建 Create procedure存储过程名[参数,参数类型] Default output With Recompile|encrypt ...

最新文章

  1. Android 屏幕适配
  2. 数据结构与算法 / 编辑器和编译器如何判定括号是否合法
  3. MindManager脑图之项目管理甘特图
  4. Centos7安装时引导错误以及解决方案
  5. 记一次 .NET医院公众号程序 线程CPU双高分析
  6. 【ArcGIS风暴】最牛逼空间数据批处理神器来了:用户自定义工具箱GeoStorm.tbx
  7. 水面反光如何拍摄_拍摄水面反射的创意
  8. 一个程序员的全部,并不是“技术”!知道为什么只能当码农吗?
  9. 【BZOJ2539】【codevs1221】丘比特的烦恼,trie树+几何判断+费用流
  10. linux界面电池信息,Linux下查看电池损耗等信息
  11. squid内存监控脚本
  12. Oracle连接pb,PB内置Oracle数据库接口的使用方法
  13. Python实现批量采集美女shipin<无水印>
  14. SQL Server 数据库增删改查语句
  15. 盘点飞机上的各种警报
  16. linux 检测SSD寿命
  17. 什么是ddos攻击,怎么防御ddos攻击?
  18. 混合云火了,云管理平台来乘风破浪
  19. 江湖云RFID电子标签在珠宝行业的应用
  20. 法国计划2020起征收数字税

热门文章

  1. 90岁老股民劝散户炒股一定要记住十句话
  2. tddl+diamond(二)
  3. 记录一次敏感词过滤算法DFA的应用案例
  4. CSS盒模型之内边距、边框、外边距 十九问 (持续更新)
  5. 动态LACP配置案例
  6. android apdp分区,EXE版 KDZTools (无需安装Python)
  7. Shell介绍及OhMyZsh
  8. ALV 处理后显示状态 (REUSE_ALV_GRID_DISPLAY 三)
  9. 开放媒体联盟着手打造免费视频格式
  10. html5制作天气动画背景,CSS icon图标之纯CSS实现带动画效果的天气图标