SQL 中 WHERE 与 HAVING 子句的使用

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

一、数据表结构

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

sale_id product_id sale_date sale_amount
1 101 2024-01-01 100
2 101 2024-01-02 200
3 102 2024-01-03 150
4 103 2024-01-04 300
5 103 2024-01-05 250

二、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_id product_id sale_date sale_amount
2 101 2024-01-02 200
4 103 2024-01-04 300
5 103 2024-01-05 250

三、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_id total_sales
103 550

四、WHERE 和 HAVING 结合使用

(一)使用场景

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

(二)示例

假设要找出销售总额超过 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_id total_sales
103 550

(三)执行顺序

  1. WHERE 子句先对 sales 表中的行进行过滤,只选择 sale_date 大于或等于 2024 年 1 月 4 日的记录。
  2. GROUP BY 对过滤后的数据按 product_id 进行分组。
  3. HAVING 子句对分组后的结果进行过滤,只选择销售总额超过 400 的产品。
相关推荐
NineData7 小时前
NineData 迁移评估功能正式上线
数据库·dba
董董灿是个攻城狮8 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
NineData12 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师15 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
AI软著研究员15 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish16 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱17 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
全栈老石19 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法