【重学 MySQL】三十九、Having 的使用

【重学 MySQL】三十九、Having 的使用

  • 基本语法
  • 示例
    • 示例 1:使用 `HAVING` 过滤分组
    • 示例 2:`HAVING` 与 `WHERE` 的结合使用
  • 注意点
  • `WHERE` 与 `HAVING` 的对比
    • 基本定义与用途
    • 主要区别
    • 示例对比
    • 总结

在这里插入图片描述

在 MySQL 中,HAVING 子句主要用于对 GROUP BY 语句产生的分组结果进行条件过滤。虽然 WHERE 子句也用于设置条件以过滤记录,但 WHERE 无法直接对聚合函数(如 COUNT(), MAX(), MIN(), SUM(), AVG() 等)的结果进行过滤。这正是 HAVING 子句的用武之地。

基本语法

SELECT column_name(s), AGGREGATE_FUNCTION(column_name)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);

示例

假设我们有一个名为 orders 的表,包含字段 order_id, customer_id, order_date, 和 amount

示例 1:使用 HAVING 过滤分组

如果我们想要找出订单总额超过 1000 的客户,我们可以使用 GROUP BYHAVING 来实现:

SELECT customer_id, SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000;

这个查询会返回所有订单总额超过 1000 的 customer_id 以及他们对应的订单总额。

示例 2:HAVINGWHERE 的结合使用

虽然 HAVING 主要用于对聚合函数的结果进行过滤,但它也可以与 WHERE 子句一起使用,其中 WHERE 子句用于在分组前过滤记录,而 HAVING 子句用于在分组后过滤结果。

SELECT customer_id, SUM(amount) AS total_amount
FROM orders
WHERE order_date > '2023-01-01'  -- 过滤 2023 年 1 月 1 日之后的订单
GROUP BY customer_id
HAVING SUM(amount) > 1000;       -- 过滤订单总额超过 1000 的客户

这个查询会首先筛选出 2023 年 1 月 1 日之后的订单,然后按 customer_id 进行分组,并计算每个客户的订单总额,最后只返回订单总额超过 1000 的客户及其订单总额。

注意点

  • HAVING 子句在 GROUP BY 子句之后执行,因此对分组后的结果进行过滤。
  • HAVING 可以使用聚合函数,而 WHERE 子句则不能。
  • 在实际应用中,如果条件可以在数据分组前通过 WHERE 子句进行过滤,则应优先使用 WHERE,因为 WHERE 过滤的数据更少,有助于提高查询效率。
  • HAVING 子句也支持使用别名(如上例中的 total_amount),但只能在 HAVING 子句中引用,不能在 WHERE 子句中引用。
  • 当过滤条件中有聚合函数时,则此过滤条件必须声明在 HAVING 中,当过滤条件中没有聚合函数时,则此过滤条件声明在 WHEREHAVING 中都可以,但是,建议大家声明在 WHERE

WHEREHAVING 的对比

在SQL中,WHEREHAVING是两个用于过滤数据的关键字,它们虽然功能相似,但在使用场景和效果上存在显著差异。

基本定义与用途

  • WHERE

    • WHERE子句是SQL查询中用于筛选结果集的可选部分。
    • 它使用布尔表达式来限制返回的行数,筛选数据并检索特定信息。
    • WHERE子句在数据分组(如果有的话)之前进行过滤,基于表中的列数据来限制返回的数据行。
  • HAVING

    • HAVING子句是一个与GROUP BY子句配合使用的条件语句,用于在数据分组后对分组结果进行过滤。
    • 它基于分组后的聚合结果进行筛选,可以使用聚合函数(如SUM、AVG、COUNT等)和逻辑操作符。

主要区别

  1. 使用时机

    • WHERE子句在数据分组之前进行过滤,而HAVING子句在数据分组之后进行过滤。
    • 如果没有使用GROUP BY子句,则HAVING的行为与WHERE类似,但HAVING支持聚合函数的使用,而WHERE不支持。
  2. 支持的函数

    • WHERE子句不能使用聚合函数作为过滤条件。
    • HAVING子句可以使用聚合函数作为过滤条件,因为它是在分组后对聚合结果进行筛选。
  3. 字段别名

    • WHERE子句中,通常不能直接使用字段别名(在某些数据库系统中可能支持,但这不是标准行为)。
    • HAVING子句中,可以使用字段别名(尤其是当别名是基于聚合函数的结果时)。
  4. 执行顺序

    • 在SQL查询的执行顺序中,WHERE子句早于GROUP BY子句执行,而HAVING子句则在GROUP BY之后执行。

示例对比

假设有一个名为orders的表,包含order_idcustomer_idsales_amount等字段,我们想要找出销售额大于1000美元的客户。

  • 使用WHERE(假设不分组,仅筛选):

    SELECT customer_id, sales_amount
    FROM orders
    WHERE sales_amount > 1000;
    

    这个查询将返回所有销售额大于1000美元的单条订单记录。

  • 使用HAVING(假设按客户分组):

    SELECT customer_id, SUM(sales_amount) AS total_sales
    FROM orders
    GROUP BY customer_id
    HAVING total_sales > 1000;
    

    这个查询将首先按customer_id分组订单,然后计算每个客户的总销售额,并返回总销售额大于1000美元的客户组。

总结

WHEREHAVING在SQL查询中各自扮演着重要的角色,它们的主要区别在于使用时机、支持的函数、字段别名的使用以及执行顺序。了解这些区别对于编写有效的SQL查询至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/54130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用powershell的脚本报错:因为在此系统中禁止执行脚本

1.添加powershell功能环境: 2.启动powershell的执行策略 因为在此系统中禁止执行脚本。 set-executionpolicy unrestricted

【计算机视觉】ch1-Introduction

相机模型与成像 1. 世界坐标系 (World Coordinate System) 世界坐标系是指物体在真实世界中的位置和方向的表示方式。在计算机视觉和图像处理领域,世界坐标系通常是一个全局坐标系统,描述了摄像机拍摄到的物体在实际三维空间中的位置。它是所有其他坐标…

刷题day11 栈与队列下【逆波兰表达式求值】【滑动窗口最大值】【前 K 个高频元素】

⚡刷题计划day11 栈与队列继续,可以点个免费的赞哦~ 往期可看专栏,关注不迷路, 您的支持是我的最大动力🌹~ 目录 ⚡刷题计划day11 栈与队列继续,可以点个免费的赞哦~ 往期可看专栏,关注不迷路&#xf…

无心剑七绝《华夏中兴》

七绝华夏中兴 长空万里尽春声 治世群英喜纵横 一代雄才华夏梦 中兴日月照前程 2024年10月1日 平水韵八庚平韵 无心剑的七绝《华夏中兴》通过对自然景观和国家景象的描绘,展现了一种恢弘的气势和对未来的美好愿景。 意境开阔:首句“长空万里尽春声”以广阔…

MATLAB数字水印系统

课题介绍 本课题为基于MATLAB的小波变换dwt和离散余弦dct的多方法对比数字水印系统。带GUI交互界面。有一个主界面GUI,可以调用dwt方法的子界面和dct方法的子界面。流程包括,读取宿主图像和水印图像,嵌入,多种方法的攻击&#xf…

跳台阶问题

剑指offer的一道简单题目。 描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 数据范围:1≤n≤40 要求:时间复杂度:O(n) &a…

C#和Python共享内存技术

我这里做一个简单的示例 1.C#写入内存的方法,FileName是内存共享的名字 t是内存size public static void SaveGluePLYToMemory(string FileName, string msg){try{ long t 100;// SetMemorySize(msg);// 100;//# 创建内存块,test1,其他语言利用这个内存…

sysbench 命令:跨平台的基准测试工具

一、命令简介 sysbench 是一个跨平台的基准测试工具,用于评估系统性能,包括 CPU、内存、文件 I/O、数据库等性能。 ‍ 比较同类测试工具 bench.sh 在上文 bench.sh:Linux 服务器基准测试中介绍了 bench.sh 一键测试脚本,它对…

Python库pandas之一

Python库pandas之一 基本数据结构Series构造器属性属性应用函数函数应用 基本数据结构 Pandas提供了两种类型的类来处理数据: Series:保存任何类型数据的一维数组。例如整数、字符串、Python对象等。DataFrame:一种二维数据结构&#xff0c…

ip是可以从能够上网的设备提取吗

是的,IP地址可以从能够上网的设备提取。以下是如何从不同设备提取IP地址的具体方法: 在电脑上提取IP地址 Windows: 打开命令提示符(按下 Win R,输入 cmd,按回车)。 输入命令 ipconfig,按回车。…

GAMES101(17~18节,物理材质模型)

材质 BRDF 材质:决定了光线与物体不同的作用方式 BRDF定义了物体材质,包含漫反射和镜面部分 BSDF (scattering散射) BRDF(reflect反射) BTDF 光线打击到物体上会向四面八方散射 反射 光线打击到物体上反射出去…

IIS开启后https访问出错net::ERR_CERT_INVALID

安装ArcGIS server和portal等,按照说明上,先开启iis,在安装server、datastore、portal、webadapter等,遇到一些问题: 问题1 访问http正常,访问https出错: 解决方案 从这里找到解决方案&…

【Android 源码分析】Activity生命周期之onPause

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

java多线程-1-测试一个多线程程序

多线程基本概念 进程:程序的基本执行实体 线程:操作系统能够进行运算调度的最小单位,包含在进程之中 多线程:在等待线程的时间,处理其他线程,提高计算机处理效率以减小资源的占用 并发:在同一时…

【QT】QWidget 重要属性

文章目录 enabledgeometrywindowTitlewindowIconqrc 机制windowOpacitycursorfontQFont toolTip 和 toolTipDurationfocusPolicyQt::FocusPolicy styleSheet enabled 作用:设置控件是否可使用. true 表⽰可用, false 表⽰禁用. 对应的API bool isEnabled(); // 获…

揭秘遗传之谜:自闭症的遗传因素分析

在星贝育园这片充满爱与希望的土地上,我们不仅见证了无数自闭症儿童在康复训练中的点滴进步,更深刻理解了自闭症这一复杂疾病的多样性和挑战性。自闭症,也称为孤独症,是一种影响社交互动、语言和非语言交流以及行为模式的神经发育…

C++ 语言特性06 - lambda表达式

一:概述 1. 语法 [ captures ] ( params ) specifiers exception -> ret { body }其中:captures 是捕获列表,用于捕获当前函数作用域的变量,分为按值捕获和按引用捕获。params 是可选参数列表,和普通函数一样。spe…

通信工程学习:什么是CSMA/CA载波监听多路访问/冲突避免

CSMA/CA:载波监听多路访问/冲突避免 CSMA/CA(Carrier Sense Multiple Access/Collision Avoidance),即载波监听多路访问/冲突避免,是一种用于数据传输时避免各站点之间冲突的算法,尤其适用于无线局域网&…

python格式化输入输出

以下是使用 format()、f-string 和百分号 % 运算符进行 Python 数据格式化输入输出的示例代码。 1. 使用 format() 方法进行格式化 # 使用 format() 方法格式化数据并输出到文件 name "Alice" age 25 score 92.5# 格式化字符串 formatted_string "Name: {…

2022年6月 Frontier 获得性能第一的论文翻译

为百万兆级加速架构做高性能 Linpack 优化 摘要 我们详细叙述了在 rocHPL 中做的性能优化,rocHPL 是 AMD 对 HPL 基准的开源实现,主要是针对节点进行优化的架构,是为百万兆级系统而设计的,比如:Frontier suppercomput…