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 |
热门文章
优秀文章