头图

在 MySQL 中,WHEREHAVING 是两个常用的过滤条件,它们虽然有相似的功能——用于从查询结果中筛选数据,但实际上它们有明显的区别。在不同的使用场景中,选择哪一个取决于数据的处理方式。下面将详细解析这两个关键字的区别和使用场景。

1. 作用范围

  • WHERE:作用于 原始数据,即查询开始时直接从表中选取符合条件的记录。它是在 查询执行 之前进行过滤的。
  • HAVING:作用于 分组后的数据,即在 GROUP BY 子句之后,用于对聚合结果进行筛选。HAVING 可以对 聚合函数 结果进行过滤,如 SUM(), COUNT(), AVG() 等。

2. 使用场景

  • WHERE:适用于对单独的行进行筛选。比如筛选某个时间段、特定价格范围或者特定类别的记录。
  • HAVING:适用于对 分组后的数据 进行筛选,通常与 GROUP BY 子句结合使用,用于对分组后的聚合数据进行进一步的过滤。例如,筛选出总销售额超过某一数值的产品类别。

3. 使用对象

  • WHERE:用于过滤 行级数据,即对表中的每一行数据进行判断。
  • HAVING:用于过滤 分组后的数据,对聚合后的数据进行判断。

4. 使用顺序

  • WHERE:在查询的最开始使用,首先对原始数据进行过滤。
  • HAVING:在 GROUP BY 后使用,首先通过聚合函数计算数据,然后再进行过滤。

对比表:WHERE 与 HAVING 的区别

特性WHEREHAVING
作用范围原始数据过滤,作用于行级数据作用于分组数据,基于聚合函数进行过滤
使用场景行级数据筛选,针对原始数据进行条件限制对聚合结果进行条件限制,通常与 GROUP BY 配合
使用时机在查询结果生成之前执行GROUP BY 之后执行
聚合函数不能使用聚合函数可以使用聚合函数(如 SUM(), AVG()
常见示例WHERE price > 100HAVING SUM(price) > 1000

5. 代码示例解析

使用 WHERE 进行行级过滤

SELECT product_name, price
FROM products
WHERE price > 100;

解释

  • 在这个查询中,WHERE 子句用于筛选 价格大于 100 的产品。查询会先从 products 表中选择所有数据,然后根据条件 price > 100 进行行级筛选。

使用 HAVING 进行分组后的数据过滤

SELECT category, SUM(price) AS total_sales
FROM products
GROUP BY category
HAVING SUM(price) > 1000;

解释

  • 这个查询首先按照产品的 category 分组,并计算每个类别的总销售额 SUM(price)。然后,HAVING 子句对分组后的总销售额进行过滤,筛选出总销售额超过 1000 的产品类别。
  • 注意,WHERE 不能在这个场景下使用,因为 WHERE 作用于原始数据行,不支持聚合函数。

6. 更详细的使用情况

WHERE 过滤条件的常见使用场景

  • 日期筛选:假设我们想查找 2023 年 1 月 1 日之后的所有订单。
SELECT order_id, order_date
FROM orders
WHERE order_date > '2023-01-01';
  • 价格筛选:筛选价格在一定范围内的产品。
SELECT product_name, price
FROM products
WHERE price BETWEEN 100 AND 500;

HAVING 过滤条件的常见使用场景

  • 按分组结果筛选:假设我们有一个按类别分组的产品销售数据,我们想筛选总销售额大于 5000 的类别。
SELECT category, SUM(price) AS total_sales
FROM products
GROUP BY category
HAVING SUM(price) > 5000;
  • 多个聚合条件:例如,我们想要筛选那些既销售额大于 5000 且销售量大于 100 的产品类别。
SELECT category, SUM(price) AS total_sales, COUNT(*) AS total_items
FROM products
GROUP BY category
HAVING SUM(price) > 5000 AND COUNT(*) > 100;

7. 小结与应用

  • WHERE 子句主要在 行级数据 上起作用,适合直接筛选原始数据。
  • HAVING 子句则用于 分组后的数据,通常配合 GROUP BY 和聚合函数使用,用于筛选分组后的统计结果。

理解并区分这两个关键字的作用,是编写高效且符合需求的 SQL 查询的关键。选择适当的过滤条件,能够显著提升查询的性能和准确性。


💡 总结:通过上面的对比和示例,WHEREHAVING 在 SQL 查询中有各自的独特作用。在选择使用时,必须理解它们的作用范围与使用场景,确保能够正确地过滤数据。


蓝易云
33 声望3 粉丝