WHERE 和 HAVING区别

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

一、Where 语句

MySQL 中的 WHERE 子句与SELECTINSERTUPDATEDELETE

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

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

Where语法

SELECT column_lists,     
FROM table_name  
WHERE conditions  
GROUP BY column_lists;  

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

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

mysql> SELECT * FROM employees  
WHERE working_hour > 9;  

我们将获得以下输出,我们可以在其中看到工作时间大于 9 的员工详细信息:

如果我们将上述查询与GROUP BY子句一起使用,我们会得到不同的结果:

mysql> SELECT * FROM employees  
WHERE working_hour > 9  
GROUP BY name;  

输出结果为:

二、Having 语句

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

此语句将条件放在由 GROUP BY 子句创建的组上。当 SQL 语句不使用 GROUP BY 关键字时,它的行为类似于 WHERE 子句。我们可以使用SUM等聚合(分组)函数、MIN、MAX、AVG和COUNT

只有两个子句:SELECT 和 HAVING。

Having语法

SELECT column_lists,     
aggregate_function (expression)    
FROM table_name  
WHERE conditions  
GROUP BY column_lists    
HAVING condition;  

让我们举个例子来理解这个语句。这里我们考虑使用同一张表的员工进行演示。

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

mysql> SELECT name, SUM(working_hour) AS "Total working hours"    
FROM employees    
GROUP BY name    
HAVING SUM(working_hour) > 6;    

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

三、WHERE 和 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 子句不允许使用聚合函数。 HAVING 子句可以与聚合函数一起使用。
场景 WHERE 子句充当预过滤器。 HAVING 子句充当后过滤器。
使用规则 我们可以将 WHERE 子句与 SELECT、UPDATE 和 DELETE 语句一起使用。 HAVING 子句只能与 SELECT 语句一起使用。
Group By结合 GROUP BY 子句位于 WHERE 子句之后。 GROUP BY 子句位于 HAVING 子句之前。

五、结论

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

热门文章

优秀文章