SQL WHERE和HAVING的区别
WHERE和HAVING子句在本文中进行了深入讨论。它们也被用于在SQL查询中过滤记录。WHERE子句和HAVING子句之间的区别是面试中最常见的问题。 主要的区别是WHERE子句用于在进行任何分组之前筛选记录的条件,而HAVING子句用于从分组中筛选值的条件。 在进行比较之前,我们首先要了解这些 SQL 子句。
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 的表,它包含以下数据:
如果我们想得到工作时间大于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子句。我们只能在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;
我们将得到以下输出,可以看到每位员工的总工作小时数:
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子句不允许使用聚合函数。