当前位置: 首页 > news >正文

SQL 中 WHERE 与 HAVING 子句的使用

在编写 SQL 查询时,数据过滤是常见需求。WHERE 和 HAVING 子句虽然都用于筛选数据,但实际用法大不相同。本文通过具体示例对比两者的核心区别,并结合实际场景演示联合使用技巧,助力快速掌握这两个关键工具的正确用法。

一、数据表结构

假设存在 sales 表,其结构如下:

sale_idproduct_idsale_datesale_amount
11012024-01-01100
21012024-01-02200
31022024-01-03150
41032024-01-04300
51032024-01-05250

二、WHERE 子句

(一)功能

用于过滤行数据,直接作用于表中的单行数据,在分组操作之前应用。

(二)特点

不能使用聚合函数。

假设尝试在 WHERE 中使用聚合函数:

SELECT product_id, SUM(sale_amount) AS total_sales
FROM sales
WHERE SUM(sale_amount) > 150;  -- ❌ 错误:WHERE 无法使用聚合函数

错误原因
执行 WHERE 时,尚未对 sale_amount 进行求和计算,因此 SUM(sale_amount) 不存在。

(三)准确示例

假设要找出 sale_amount 大于 150 的销售记录。

SELECT *
FROM sales
WHERE sale_amount > 150;

结果

sale_idproduct_idsale_datesale_amount
21012024-01-02200
41032024-01-04300
51032024-01-05250

三、HAVING 子句

(一)功能

用于过滤分组后的结果集,作用于分组后的数据,在分组操作之后应用。

(二)特点

可以使用聚合函数(如 SUM()AVG()COUNT() 等)来定义过滤条件。

(三)具体示例

假设要找出销售总额超过 400 的产品。

SELECT product_id, SUM(sale_amount) AS total_sales
FROM sales
GROUP BY product_id
HAVING SUM(sale_amount) > 400;

结果

product_idtotal_sales
103550

四、WHERE 和 HAVING 结合使用

(一)使用场景

当需要先对行数据进行过滤,再对分组结果进行过滤时,可结合使用 WHERE 和 HAVING 子句。

(二)示例

假设要找出销售总额超过 400 的产品,并且只考虑在 2024 年 1 月 4 日及之后的销售记录。

SELECT product_id, SUM(sale_amount) AS total_sales
FROM sales
WHERE sale_date >= '2024-01-04'
GROUP BY product_id
HAVING SUM(sale_amount) > 400;

结果

product_idtotal_sales
103550

(三)执行顺序

  1. WHERE 子句先对 sales 表中的行进行过滤,只选择 sale_date 大于或等于 2024 年 1 月 4 日的记录。
  2. GROUP BY 对过滤后的数据按 product_id 进行分组。
  3. HAVING 子句对分组后的结果进行过滤,只选择销售总额超过 400 的产品。

相关文章:

  • 一些关于瓶装燃气送气工考试的常见考点
  • Spring MVC 参数校验-校验注解
  • Asahi Linux 核心开发者暂停苹果 GPU Linux 驱动开发工作
  • GGUF、Transformer、AWQ 详解与关系梳理
  • 【最新版0.47.8】Cursor下载安装教程
  • iPhone 16怎么编辑图片?图片编辑技巧、软件分享
  • [Xilinx]工具篇_PetaLinux自动编译
  • 全面解析软件开发流程与工具对比
  • Evo2:跨所有生命领域的基因组建模与设计
  • 利用Linux的I2C子系统和i2c-tools工具集写出的对I2C设备AP3216C读写的应用程序
  • Python Cookbook-4.8 二维阵列变换
  • ZooKeeper集群高可用性测试与实践:从规划到故障模拟
  • 单片机flash存储也做磨损均衡
  • 分布式训练与多GPU加速策略
  • 创造型设计模式
  • IP查询底层逻辑解析:数据包与地理位置
  • 【虚幻引擎UE5】SpawnActor生成Character实例不执行AI Move To,未初始化AIController的原因和解决方法
  • 嵌入式4-Modbus
  • 网络类型及数据链路层协议【复习篇】
  • MySQL身份验证的auth_socket插件
  • 以军在加沙北部和南部展开大规模地面行动
  • 第十届青春文学奖揭晓,梁晓声获特别奖
  • 嫩黑线货物列车脱轨致1名路外人员死亡,3人被采取刑事强制措施
  • 受关税政策影响,沃尔玛将上调部分商品在美售价
  • 昔日千亿房企祥生集团约2.03亿元债权被拍卖,起拍价8000万元
  • 不是10点!乌克兰官员称尚未就俄乌谈判开始时间达成一致