SQL Having

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

此 SQL 子句在“SELECT”语句中的“GROUP BY”子句之后实现。

在 SQL 中使用该子句是因为我们不能将 WHERE 子句与 SQL 聚合函数一起使用。WHERE 和 HAVING 子句都用于过滤 SQL 查询中的记录。

一、HAVING 和 WHERE 子句的区别

数据库中 WHERE 和 HAVING 子句之间的区别是 IT 面试中最重要的问题。

下表显示了这两个子句之间的比较,但主要区别在于WHERE 子句

在进行任何分组之前使用条件过滤记录,而 HAVING 子句使用条件过滤来自组的值。

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

二、SQL中HAVING子句的语法 

SELECT column_Name1, column_Name2, ....., column_NameN aggregate_function_name(column_Name) FROM table_name GROUP BY column_Name1 HAVING condition; 

三、SQL中的HAVING子句示例

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

示例1

我们以下面的Employee表为例,它可以帮助您使用 SUM 聚合函数分析 HAVING 子句:

Emp_Id Emp_Name Emp_Salary Emp_City
201 Abhay 2000 Goa
202 Ankit 4000 Delhi
203 Bheem 8000 Jaipur
204 Ram 2000 Goa
205 Sumit 5000 Delhi

如果要添加每个城市的员工工资,则必须编写以下查询:

SELECT SUM(Emp_Salary), Emp_City FROM Employee GROUP BY Emp_City;  

上述查询的输出显示以下输出:

SUM(Emp_Salary) Emp_City
4000 Goa
9000 Delhi
8000 Jaipur

现在,假设您要显示员工总工资超过 5000 的城市。对于这种情况,您必须在 SQL 中使用 HAVING 子句键入以下查询: 

SELECT SUM(Emp_Salary), Emp_City FROM Employee GROUP BY Emp_City HAVING SUM(Emp_Salary)>5000; 

上述 SQL 查询的输出在输出中显示了下表:

SUM(Emp_Salary) Emp_City
9000 Delhi
8000 Jaipur

 示例2

我们来看下面的Student_details表,它可以帮助您使用 COUNT 聚合函数分析 HAVING 子句:

Roll_No Name Marks Age
1 Rithik 91 20
2 Kapil 60 19
3 Arun 82 17
4 Ram 92 18
5 Anuj 50 20
6 Suman 88 18
7 Sheetal 57 19
8 Anuj 64 20

假设,您想根据年龄计算上表中的学生人数。为此,您必须编写以下查询: 

SELECT COUNT(Roll_No), Age FROM Student_details GROUP BY Age ; 

上面的查询将显示以下输出:

Count(Roll_No) Age
3 20
2 19
1 17
2 18

现在,假设您要显示卷数大于等于 2 的学生的年龄。对于这种情况,您必须在 SQL 中使用 HAVING 子句键入以下查询:

SELECT COUNT(Roll_No), Age FROM Student_details GROUP BY Age HAVING COUNT(Roll_No) >= 2 ;

 上述 SQL 查询的输出在输出中显示了下表:

Count(Roll_No) Age
3 20
2 19
2 18

示例3

我们以下面的Employee表为例,它可以帮助您分析具有 MIN 和 MAX 聚合函数的 HAVING 子句: 

Emp_ID Name Emp_Salary Emp_Dept
1001 Anuj 9000 Finance
1002 Saket 4000 HR
1003 Raman 3000 Coding
1004 Renu 6000 Coding
1005 Seenu 5000 HR
1006 Mohan 10000 Marketing
1007 Anaya 4000 Coding
1008 Parul 8000 Finance

带有 HAVING 子句的 MIN 函数

如果要显示每个部门以及每个部门的最低工资,则必须编写以下查询:

SELECT MIN(Emp_Salary), Emp_Dept FROM Employee GROUP BY Emp_Dept;  

上述查询的输出显示以下输出:

MIN(Emp_Salary) Emp_Dept
8000 Finance
4000 HR
3000 Coding
10000 Marketing

现在,假设您只想显示员工最低工资大于 4000 的部门。对于这种情况,您必须在 SQL 中使用 HAVING 子句键入以下查询:

SELECT MIN(Emp_Salary), Emp_Dept FROM Employee GROUP BY Emp_Dept HAVING MIN(Emp_Salary) > 4000 ;  

上面的 SQL 查询在输出中显示了下表:

MIN(Emp_Salary) Emp_Dept
8000 Finance
10000 Marketing

带有 HAVING 子句的 MAX 函数

在上面的员工表中,如果要列出每个部门以及每个部门的最高工资。为此,您必须编写以下查询:

SELECT MAX(Emp_Salary), Emp_Dept FROM Employee GROUP BY Emp_Dept;  

上面的查询将显示以下输出:

MAX(Emp_Salary) Emp_Dept
9000 Finance
5000 HR
6000 Coding
10000 Marketing

现在,假设您只想显示员工最高工资低于 8000 的那些部门。对于这种情况,您必须在 SQL 中使用 HAVING 子句键入以下查询:

SELECT MAX(Emp_Salary), Emp_Dept FROM Employee GROUP BY Emp_Dept HAVING MAX(Emp_Salary) < 8000 ; 

上述 SQL 查询的输出在输出中显示了下表:

MAX(Emp_Salary) Emp_Dept
5000 HR
6000 Coding

 示例4

我们来看下面的Employee_Dept表,它可以帮助您使用 AVG 聚合函数分析 HAVING 子句:

Emp_ID Name Emp_Salary Emp_Dept
1001 Anuj 8000 Finance
1002 Saket 4000 HR
1003 Raman 3000 Coding
1004 Renu 6000 Coding
1005 Seenu 5000 HR
1006 Mohan 10000 Marketing
1007 Anaya 4000 Coding
1008 Parul 6000 Finance

如果要查找每个部门员工的平均工资,则必须编写以下查询:

SELECT AVG(Emp_Salary), Emp_Dept FROM Employee_Dept GROUP BY Emp_Dept; 

上面的查询将显示以下输出:

AVG(Emp_Salary) Emp_Dept
7000 Finance
4500 HR
6500 Coding
10000 Marketing

现在,假设您要显示平均工资大于等于 6500 的部门。对于这种情况,您必须在 SQL 中使用 HAVING 子句键入以下查询:

SELECT AVG(Emp_Salary), Emp_Dept FROM Employee_Dept GROUP BY Emp_Dept HAVING AVG(Emp_Salary) > 6500 ;  

上面的 SQL 查询将在输出中显示下表:

AVG(Emp_Salary) Emp_Dept
7000 Finance
6500 Coding
10000 Marketing

热门文章

优秀文章