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

news/2024/9/28 17:58:47/

【重学 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.ppmy.cn/news/1531009.html

相关文章

【linux】地平线RDK X3派配置音频驱动板:Audio Driver HAT V2

1、简述 地平线RDK X3不带音频功能,需要配置音频驱动板卡或者USB转音频模块。 参考网址: 1)RDK X3系列音频板使用指南: https://developer.d-robotics.cc/rdk_doc/Basic_Application/audio/audio_board_x3 2)Audio Driver HAT REV2 微雪电子购买链接: https://www.wav…

改进拖放PDF转换为图片在转换为TXT文件的程序

前段时间我写了Python识别拖放的PDF文件再转成文本文件-CSDN博客 最近有2点更新,一是有一些pdf文件转换出来的图片是横的,这样也可以识别文字,但是可能会影响效果,另一个是发现有一些文字识别不出来,看了关于提高Padd…

Python--操作列表

1.for循环 1.1 for循环的基本语法 for variable in iterable: # 执行循环体 # 这里可以是任何有效的Python代码块这里的variable是一个变量名,用于在每次循环迭代时临时存储iterable中的下一个元素。 iterable是一个可迭代对象,比如列表(…

OJ在线评测系统 后端 使用代理模式编写测试类 并 实现核心业务判题流程

编写测试类(代理模式) 实现示例的代码沙箱 package com.dduo.dduoj.judge.codesandbox.impl;import com.dduo.dduoj.judge.codesandbox.CodeSandbox; import com.dduo.dduoj.judge.codesandbox.model.ExecuteCodeRequest; import com.dduo.dduoj.judge.codesandbox.model.Exec…

【Java】字符串处理 —— String、StringBuffer 与 StringBuilder

由于String类是final类型的,所以使用String定义的字符串是一个常量,因此它一旦创建,其内容和长度是不可改变的。如果需要对一个字符串进行修改,则只能创建新的字符串。为了便于对字符串进行修改,在JDK中提供了一个Stri…

5步了解 地理处理合成孔径雷达工具集

摘要: 本文将带大家了解 ArcGIS Pro 合成孔径雷达工具集中的所有地理处理工具。有了 Image Analyst 许可证,就可以访问 Image Analyst 工具箱中的此工具集。此工具集是锦上添花,它使处理 SAR Ground Range Detect... 本文将带大家了解 ArcGIS Pro 合成孔径雷达工具集中的所有…

安装镜像烧录软件Etcher

一、下载Etcher安装包 访问官方网站: 打开浏览器,访问Etcher的官方网站https://etcher.balena.io/#download-etcher 下载安装包: 在官方网站找到Etcher的下载链接。 点击下载链接 二、安装Etcher 命令安装 点击下载链接会跳转至以下界面…

Vue 响应式监听 Watch 最佳实践

一. 前言 上一篇文章我们学习了 watch 的基础知识,了解了它的基本使用方法及注意事项,本篇文章我们继续了解在Vue 中 响应式监听 watch 的妙用。了解 watch 的基础使用请参考上一篇文章: 详解 Vue 中 Watch 的使用方法及注意事项https://bl…