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. 而可以轻松地在UPDATE、DELETE和SELECT语句中使用WHERE子句。 |
5. HAVING子句在SQL查询中在GROUP BY子句之后使用。 | 5. WHERE子句始终在SQL查询中在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子句的示例
在本文中,我们提供了以下四个不同的示例,将帮助您了解如何在不同的SQL聚合函数中使用HAVING子句:
示例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 表格,它可以帮助您分析HAVING子句的MIN和MAX聚合函数:
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 |
MIN函数和HAVING子句:
如果您想显示每个部门及每个部门的最低工资,您必须编写以下查询:
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 |
MAX函数与HAVING子句:
在上述员工表中,如果你想列出每个部门以及每个部门中的最高工资。为此,你需要编写以下查询:
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 |