本文最后更新于 2024-08-24,文章内容可能已经过时。

在SQL中,HAVINGWHERE 都用于过滤数据,但它们的用法和作用范围有所不同。以下是它们的主要区别:

1. 作用范围不同

  • WHERE: 用于在SQL查询中过滤从数据库表中选择的行。它在数据分组(GROUP BY)之前进行过滤操作。

  • HAVING: 用于过滤通过分组(GROUP BY)后的组。它通常与聚合函数(如 COUNT、SUM、AVG 等)一起使用。

2. 适用条件不同

  • WHERE: 不能与聚合函数一起直接使用。它主要用于指定行级别的条件。

  • HAVING: 可以与聚合函数一起使用,用于指定组级别的条件。

示例

假设我们有一个名为 sales 的表,包含以下列:

  • id: 售货记录的唯一标识

  • salesperson: 销售人员的名字

  • amount: 销售金额

  • date: 销售日期

使用 WHERE 过滤行

假如我们想要查询销售金额大于100的记录,可以使用 WHERE 子句:

SELECT * FROM sales
WHERE amount > 100;

使用 HAVING 过滤组

假如我们想要查询每个销售人员的总销售额大于500的记录,可以使用 HAVING 子句:

SELECT salesperson, SUM(amount) AS total_sales
FROM sales
GROUP BY salesperson
HAVING SUM(amount) > 500;

在这个例子中,WHERE 不能用于过滤 SUM(amount) 的结果,因为 WHERE 在数据分组之前执行,而 HAVING 在分组之后执行。

总结

  • WHERE: 用于在数据分组之前过滤行,不能与聚合函数一起直接使用

  • HAVING: 用于在数据分组之后过滤组,可以与聚合函数一起使用

这两个子句可以在同一个查询中一起使用,以实现更复杂的过滤条件。例如:

SELECT salesperson, SUM(amount) AS total_sales
FROM sales
WHERE date >= '2024-01-01'
GROUP BY salesperson
HAVING SUM(amount) > 500;

在这个查询中,WHERE 子句首先过滤出2024年及以后的销售记录,然后 GROUP BY 子句对结果进行分组,最后 HAVING 子句过滤出总销售额大于500的销售人员。