WHERE 和 HAVING 之间的区别

17 Mar 2025 | 5 分钟阅读

本文深入探讨了 WHERE 和 HAVING 子句。它们也用于在 SQL 查询中过滤记录。WHERE 和 HAVING 子句之间的区别是面试中最常见的问题。它们之间的主要区别在于,WHERE 子句用于在进行任何分组之前指定过滤记录的条件,而 HAVING 子句用于指定过滤组中值的条件。 在进行比较之前,我们首先了解这些 SQL 子句。

WHERE vs HAVING

WHERE 子句

MySQL 中的 WHERE 子句与 SELECTINSERTUPDATEDELETE 查询一起使用,用于从表或关系中过滤数据。它在使用 JOIN 子句 从单个表或多个表中检索记录时描述一个特定条件。如果满足指定条件,它将从表中返回特定值。WHERE 子句 对选定的列施加条件。

MySQL 中的 WHERE 子句还可以实现逻辑连接词 ANDOR 和 NOT。它们被称为布尔条件,必须为 true 才能检索数据。逻辑连接词表达式使用比较运算符作为其操作数,例如 <、<=、>、>=、= 和 <>。比较运算符通常用于比较字符串和算术表达式。

以下语法说明了 WHERE 子句的用法

让我们举个例子来理解这个子句。假设我们有一个名为 employees 的表,其中包含以下数据

WHERE vs HAVING

如果我们想获取工作时间大于 9 的员工详情,那么我们可以使用如下语句

我们将得到以下输出,其中我们可以看到工作时间大于 9 的员工详情

WHERE vs HAVING

如果我们对上述查询使用 GROUP BY 子句,我们将得到不同的结果

这是输出

WHERE vs HAVING

HAVING 子句

MySQL 中的 HAVING 子句与 GROUP BY 子句结合使用,使我们能够指定条件来过滤哪些组结果出现在结果中。它只返回满足某些条件的组中在最终结果中的那些值。我们也可以在选择时同时使用 WHERE 和 HAVING 子句。在这种情况下,WHERE 子句首先过滤单个行,然后行被分组,执行聚合计算,最后 HAVING 子句过滤组。

此子句对 GROUP BY 子句创建的组施加条件。当 SQL 语句不使用 GROUP BY 关键字时,它的行为类似于 WHERE 子句。我们只能在两个子句中使用聚合(组)函数,例如 SUM、MIN、MAX、AVG 和 COUNT:SELECT 和 HAVING。

以下语法说明了 HAVING 子句的用法

让我们举个例子来理解这个子句。这里我们考虑相同的表 employees 进行演示。

如果我们想获取每个员工总工作时间大于 6 小时,那么我们可以使用如下语句

我们将得到以下输出,其中我们可以看到每个员工的总工作时间

WHERE vs HAVING

WHERE 和 HAVING 子句的主要区别

以下几点解释了数据库和模式之间的主要区别

  • WHERE 子句过滤单个行,而 HAVING 子句过滤组而不是一次一行。
  • 我们不能将 WHERE 子句与聚合函数一起使用,因为它用于过滤单个行。相比之下,HAVING 可以与聚合函数一起使用,因为它用于过滤组。
  • 行操作由 WHERE 子句处理,而 HAVING 子句处理列操作以汇总行或组。
  • WHERE 在 GROUP BY 之前,这意味着 WHERE 子句在执行聚合计算之前过滤行。HAVING 在 GROUP BY 之后,这意味着 HAVING 子句在执行聚合计算之后过滤行。因此,从效率方面来看,HAVING 比 WHERE 慢,应尽可能避免使用。
  • 我们可以在 SELECT 查询中同时使用 WHERE 和 HAVING 子句。在这种情况下,WHERE 子句首先用于过滤单个行。然后对行进行分组,执行聚合计算,最后使用 HAVING 子句过滤组。
  • WHERE 子句根据指定条件检索所需数据。另一方面,HAVING 子句首先获取所有数据,然后根据指定条件进行分离。
  • 没有 SELECT 语句,我们不能使用 HAVING 子句。相反,我们可以将 WHERE 与 SELECT、UPDATE 和 DELETE 语句一起使用。
  • WHERE 子句是预过滤器,而 HAVING 子句是后过滤器。

WHERE 与 HAVING 比较表

以下比较图快速解释了它们的主要区别

比较基础WHERE 子句HAVING 子句
定义它用于对单个行执行过滤。它用于对组执行过滤。
基本功能它在行操作中实现。它在列操作中实现。
数据获取WHERE 子句根据指定条件从特定行获取特定数据HAVING 子句首先获取完整数据。然后根据给定条件进行分离。
聚合函数WHERE 子句不允许与聚合函数一起使用。HAVING 子句可以与聚合函数一起使用。
作用WHERE 子句作为预过滤器。HAVING 子句作为后过滤器。
与...一起使用我们可以将 WHERE 子句与 SELECT、UPDATE 和 DELETE 语句一起使用。HAVING 子句只能与 SELECT 语句一起使用。
GROUP BYGROUP BY 子句在 WHERE 子句之后。GROUP BY 子句在 HAVING 子句之前。

结论

在本文中,我们对 WHERE 和 HAVING 子句进行了比较。我们得出结论,这两个子句在过滤数据方面以相同的方式工作,但一些附加功能使 HAVING 子句更受欢迎。我们可以在 HAVING 子句中有效地使用聚合函数,而 WHERE 不允许使用聚合函数。