SQL WHERE和HAVING的区别

SQL WHERE和HAVING的区别

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

SQL WHERE和HAVING的区别

WHERE子句

WHERE子句在MySQL中与SELECT、INSERT、UPDATE和DELETE查询一起使用,用于从表中筛选数据。它描述了在使用JOIN子句从单个表或多个表检索记录时的特定条件。如果满足指定的条件,它将返回表中的特定值。WHERE子句对所选列设置条件。

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

以下语法说明了WHERE子句的使用方式:

SELECT column_lists,   
FROM table_name
WHERE conditions
GROUP BY column_lists;

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

SQL WHERE和HAVING的区别

如果我们想得到工作时间大于9小时的员工详细信息,那么我们可以使用以下语句:

mysql> SELECT * FROM employees
WHERE working_hour > 9;

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

SQL WHERE和HAVING的区别

如果我们使用上面的查询带上GROUP BY子句,将会得到不同的结果:

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

这是输出结果:

SQL WHERE和HAVING的区别

HAVING子句

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

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

以下语法示例演示了使用HAVING子句:

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

让我们通过一个示例来理解这个子句。这里我们考虑的是同一个表 employees 进行演示。

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

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

我们将得到以下输出,可以看到每位员工的总工作小时数:

SQL WHERE和HAVING的区别

WHERE和HAVING子句之间的主要区别

以下是数据库和模式之间的主要区别的解释:

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

WHERE vs. 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子句不允许使用聚合函数。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程