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

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 的产品。

http://www.kler.cn/a/594474.html

相关文章:

  • STM32工程模板及文件作用
  • HarmonyOS开发,防截屏防录屏的api介绍及功能实现
  • 24.策略模式实现日志
  • 在Ubuntu上安装MEAN Stack的4个步骤
  • 第五: redis 安装 / find 查找目录
  • 【Go 】异常处理
  • 网络空间安全(36)数据库权限提升获取webshell思路总结
  • 【模拟面试】计算机考研复试集训(第七天)
  • Jvm运行时数据区有哪些
  • ubuntu升级后网卡不可用,提示*-network UNCLAIMED
  • 【redis】在 Spring中操作 Redis
  • docker学习整理
  • 早餐 3.20
  • AI时代,谁能拯救后端开发
  • AI时代API安全挑战加剧,解读API防护的最佳方案
  • sqli-labs学习笔记
  • Redis哨兵模式-黑马学习笔记
  • 如何避免Bug跟踪系统混乱
  • 【分布式锁通关指南 08】源码剖析redisson可重入锁之释放及阻塞与非阻塞获取
  • 【保姆级】阿里云codeup配置Git的CI/CD步骤