SQL Having语句
SQL HAVING语句
SQL的HAVING语句与WHERE语句类似;两者都用于根据指定的条件过滤表中的行。然而,HAVING语句用于过滤分组的行,而不是单个行。这些行通过GROUP BY子句进行分组,因此HAVING子句必须始终跟在GROUP BY子句后面。
此外,HAVING语句可以与COUNT()、SUM()、AVG()等聚合函数一起使用,而WHERE语句不能与它们一起使用。
语法
以下是SQL HAVING语句的基本语法−
下面的代码块显示了在查询中HAVING子句的位置
有GROUP BY子句的HAVING
我们可以使用HAVING子句和GROUP BY子句来过滤满足特定条件的行组。在执行聚合操作后,它用于对结果集应用筛选条件。
示例
假设我们已经使用以下查询创建了一个名为CUSTOMERS的表,其中包含了客户的姓名、年龄、地址和薪水等个人信息。
现在使用以下INSERT语句将值插入到这个表中−
创建的表格如下所示 −
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Ramesh | 32 | Hyderabad | 2000.00 |
2 | Khilan | 32 | Hyderabad | 1500.00 |
3 | Kaushik | 23 | Delhi | 2000.00 |
4 | Chaitali | 32 | Delhi | 6500.00 |
5 | Hardik | 23 | Bhopal | 8500.00 |
6 | Komal | 25 | Indore | 4500.00 |
7 | Muffy | 25 | Indore | 10000.00 |
现在,我们正在根据地址和年龄列对CUSTOMERS表的记录进行分组,并过滤掉年龄值小于25的分组。
输出
生成的结果如下:
ADDRESS | AGE | MIN_SUM |
---|---|---|
Hyderabad | 32 | 1500.00 |
Delhi | 32 | 6500.00 |
HAVING with ORDER BY Clause
ORDER BY子句用于根据特定列(可以是升序或降序)排列/排序SELECT查询结果的记录。如果我们将ORDER BY子句与HAVING子句一起使用,可以按所需顺序排序过滤后的分组。
示例
以下查询基于AGE和ADDRESS列对CUSTOMERS表的记录进行分组,过滤SALARY值小于5000的分组,并按每个分组的总工资降序排列剩余的分组。
输出
生成的结果如下:
ADDRESS | AGE | TOTAL_SALARY |
---|---|---|
INDORE | 25 | 14500.00 |
BHOPAL | 23 | 8500.00 |
DELHI | 32 | 6500.00 |
COUNT()函数的HAVING子句
HAVING子句可以与COUNT()函数一起使用,根据它们包含的行数来筛选组。
示例
以下查询根据AGE列对CUSTOMERS表的记录进行分组,并检索包含超过两个实体的组的详细信息 –
输出
这将产生以下结果−
AGE | COUNT(AGE) |
---|---|
32 | 3 |
使用AVG()函数的HAVING子句
HAVING子句也可以与AVG()函数一起使用,根据指定列的平均值筛选组。
示例
现在,我们正在检索平均工资大于5240的客户所在的城市。
输出
以下是上述查询的输出结果-
ADDRESS | AVG_SALARY |
---|---|
Bhopal | 8500.000000 |
Indore | 7250.000000 |
使用MAX()函数的HAVING子句
我们还可以使用HAVING子句与MAX()函数一起根据指定列的最大值来过滤分组。
示例
现在,我们正在检索薪水最大值大于5240的客户的城市。
输出
得到的结果如下:
ADDRESS | MAX_SALARY |
---|---|
Bhopal | 8500.00 |
Indore | 10000.00 |