SQL 中的 HAVING 子句

17 Mar 2025 | 5 分钟阅读

HAVING 子句在 SELECT 语句的 GROUP BY 子句定义的组中放置条件。

此 SQL 子句在 SELECT 语句的 'GROUP BY' 子句之后实现。

此子句在 SQL 中使用,因为我们无法在 SQL 聚合函数中使用 WHERE 子句。WHERE 和 HAVING 子句都用于过滤 SQL 查询中的记录。

HAVING 和 WHERE 子句的区别

WHERE 和 HAVING 子句在数据库中的区别是在 IT 面试中常被问到的重要问题。

下表显示了这两个子句之间的比较,但主要区别在于 WHERE 子句 在进行任何分组之前使用条件过滤记录,而 HAVING 子句使用条件从组中过滤值。

HAVINGWHERE
1. HAVING 子句用于数据库系统,根据给定条件从组中获取数据/值。1. WHERE 子句用于数据库系统,根据给定条件从表中获取数据/值。
2. HAVING 子句始终与 GROUP BY 子句一起执行。2. WHERE 子句可以在没有 GROUP BY 子句的情况下执行。
3. HAVING 子句可以在查询或语句中包含 SQL 聚合函数。3. 我们不能在语句中使用带有 WHERE 子句的 SQL 聚合函数。
4. 我们只能将 SELECT 语句与 HAVING 子句一起用于过滤记录。4. 而我们可以轻松地将 WHERE 子句与 UPDATE、DELETE 和 SELECT 语句一起使用。
5. HAVING 子句在 SQL 查询中 GROUP BY 子句之后使用。5. WHERE 子句在 SQL 查询中的 GROUP BY 子句之前使用。
6. 我们可以对列操作实现此 SQL 子句。6. 我们可以对行操作实现此 SQL 子句。
7. 这是一个后置过滤器。7. 这是一个前置过滤器。
8. 它用于过滤组。8. 它用于过滤表的单条记录。

SQL 中 HAVING 子句的语法

SQL 中 HAVING 子句的示例

在本文中,我们使用了以下四个不同的示例,它们将帮助您了解如何使用 HAVING 子句以及不同的 SQL 聚合函数。

示例 1: 让我们看下面的 Employee 表,它有助于您使用 SUM 聚合函数分析 HAVING 子句。

员工 IDEmp_NameEmp_SalaryEmp_City
201Abhay2000果阿
202Ankit4000德里
203Bheem8000斋浦尔
204 Ram2000果阿
205Sumit5000德里

如果您想计算每个城市的员工的薪水总和,您需要编写以下查询。

上述查询的输出显示以下结果。

SUM(Emp_Salary)Emp_City
4000果阿
9000德里
8000斋浦尔

现在,假设您想显示员工总薪水超过 5000 的城市。在这种情况下,您需要在 SQL 中使用 HAVING 子句编写以下查询。

上述 SQL 查询的输出在结果中显示以下表。

SUM(Emp_Salary)Emp_City
9000德里
8000斋浦尔

示例 2: 让我们看下面的 Student_details 表,它有助于您使用 COUNT 聚合函数分析 HAVING 子句。

Roll_No名称分数年龄
1Rithik9120
2Kapil6019
3Arun8217
4Ram9218
5Anuj5020
6Suman8818
7Sheetal5719
8Anuj6420

假设您想根据年龄统计上述表中的学生人数。为此,您需要编写以下查询。

上述查询将显示以下输出。

Count(Roll_No)年龄
320
219
117
218

现在,假设您想显示学号大于等于 2 的学生的年龄。在这种情况下,您需要在 SQL 中使用 HAVING 子句编写以下查询。

上述 SQL 查询的输出在结果中显示以下表。

Count(Roll_No)年龄
320
219
218

示例 3: 让我们看下面的 Employee 表,它有助于您使用 MIN 和 MAX 聚合函数分析 HAVING 子句。

Emp_ID名称Emp_SalaryEmp_Dept
1001Anuj9000融资
1002Saket4000HR
1003拉曼 (Raman)3000编码
1004Renu6000编码
1005Seenu5000HR
1006Mohan10000营销
1007Anaya4000编码
1008Parul8000融资

MIN 函数与 HAVING 子句

如果您想显示每个部门和每个部门的最低薪水,您需要编写以下查询。

上述查询的输出显示以下结果。

MIN(Emp_Salary)Emp_Dept
8000融资
4000HR
3000编码
10000营销

现在,假设您只想显示员工最低薪水大于 4000 的部门。在这种情况下,您需要在 SQL 中使用 HAVING 子句编写以下查询。

上述 SQL 查询在结果中显示以下表。

MIN(Emp_Salary)Emp_Dept
8000融资
10000营销

MAX 函数与 HAVING 子句

在上面的员工表中,如果您想列出每个部门和每个部门的最高薪水。为此,您需要编写以下查询。

上述查询将显示以下输出。

MAX(Emp_Salary)Emp_Dept
9000融资
5000HR
6000编码
10000营销

现在,假设您只想显示员工最高薪水小于 8000 的部门。在这种情况下,您需要在 SQL 中使用 HAVING 子句编写以下查询。

上述 SQL 查询的输出在结果中显示以下表。

MAX(Emp_Salary)Emp_Dept
5000HR
6000编码

示例 4: 让我们看下面的 Employee_Dept 表,它有助于您使用 AVG 聚合函数分析 HAVING 子句。

Emp_ID名称Emp_SalaryEmp_Dept
1001Anuj8000融资
1002Saket4000HR
1003拉曼 (Raman)3000编码
1004Renu6000编码
1005Seenu5000HR
1006Mohan10000营销
1007Anaya4000编码
1008Parul6000融资

如果您想计算每个部门的员工平均薪水,您需要编写以下查询。

上述查询将显示以下输出。

AVG(Emp_Salary)Emp_Dept
7000融资
4500HR
6500编码
10000营销

现在,假设您想显示平均薪水大于等于 6500 的部门。在这种情况下,您需要在 SQL 中使用 HAVING 子句编写以下查询。

上述 SQL 查询将在结果中显示以下表。

AVG(Emp_Salary)Emp_Dept
7000融资
6500编码
10000营销

下一主题SQL ORDER BY