WHERE 和 HAVING区别
本文深入讨论了 WHERE 和 HAVING 子句。它们还用于过滤 SQL 查询中的记录。WHERE 和 HAVING 子句之间的区别是面试期间最常见的问题。它们之间的主要区别在于,WHERE 子句用于在进行任何分组之前指定过滤记录的条件,而 HAVING 子句用于指定从组中过滤值的条件。在进行比较之前,我们首先要了解这些SQL子句。
一、Where 语句
MySQL 中的 WHERE 子句与SELECT、INSERT、UPDATE和DELETE
MySQL 中的 WHERE 子句还可以实现逻辑连接词 AND、OR和 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
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 不允许使用聚合函数。
热门文章
优秀文章