SQL Having语句
SQL HAVING语句
SQL的HAVING语句与WHERE语句类似;两者都用于根据指定的条件过滤表中的行。然而,HAVING语句用于过滤分组的行,而不是单个行。这些行通过GROUP BY子句进行分组,因此HAVING子句必须始终跟在GROUP BY子句后面。
此外,HAVING语句可以与COUNT()、SUM()、AVG()等聚合函数一起使用,而WHERE语句不能与它们一起使用。
语法
以下是SQL HAVING语句的基本语法−
SELECT column1, column2, aggregate_function(column)
FROM table_name
GROUP BY column1, column2
HAVING condition;
下面的代码块显示了在查询中HAVING子句的位置
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
有GROUP BY子句的HAVING
我们可以使用HAVING子句和GROUP BY子句来过滤满足特定条件的行组。在执行聚合操作后,它用于对结果集应用筛选条件。
示例
假设我们已经使用以下查询创建了一个名为CUSTOMERS的表,其中包含了客户的姓名、年龄、地址和薪水等个人信息。
CREATE TABLE CUSTOMERS (
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
现在使用以下INSERT语句将值插入到这个表中−
INSERT INTO CUSTOMERS VALUES
(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);
创建的表格如下所示 −
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的分组。
SELECT ADDRESS, AGE, MIN(SALARY) AS MIN_SUM FROM CUSTOMERS GROUP BY ADDRESS, AGE HAVING AGE > 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的分组,并按每个分组的总工资降序排列剩余的分组。
SELECT ADDRESS, AGE, SUM(SALARY) AS TOTAL_SALARY FROM CUSTOMERS GROUP BY ADDRESS, AGE HAVING TOTAL_SALARY >=5000 ORDER BY TOTAL_SALARY DESC;
输出
生成的结果如下:
ADDRESS | AGE | TOTAL_SALARY |
---|---|---|
INDORE | 25 | 14500.00 |
BHOPAL | 23 | 8500.00 |
DELHI | 32 | 6500.00 |
COUNT()函数的HAVING子句
HAVING子句可以与COUNT()函数一起使用,根据它们包含的行数来筛选组。
示例
以下查询根据AGE列对CUSTOMERS表的记录进行分组,并检索包含超过两个实体的组的详细信息 –
SELECT AGE, COUNT(AGE) FROM CUSTOMERS GROUP BY AGE HAVING COUNT(age) > 2;
输出
这将产生以下结果−
AGE | COUNT(AGE) |
---|---|
32 | 3 |
使用AVG()函数的HAVING子句
HAVING子句也可以与AVG()函数一起使用,根据指定列的平均值筛选组。
示例
现在,我们正在检索平均工资大于5240的客户所在的城市。
SELECT ADDRESS, AVG(SALARY) as AVG_SALARY FROM CUSTOMERS GROUP BY ADDRESS HAVING AVG(SALARY) > 5240;
输出
以下是上述查询的输出结果-
ADDRESS | AVG_SALARY |
---|---|
Bhopal | 8500.000000 |
Indore | 7250.000000 |
使用MAX()函数的HAVING子句
我们还可以使用HAVING子句与MAX()函数一起根据指定列的最大值来过滤分组。
示例
现在,我们正在检索薪水最大值大于5240的客户的城市。
SELECT ADDRESS, MAX(SALARY) as MAX_SALARY FROM CUSTOMERS GROUP BY ADDRESS HAVING MAX(SALARY) > 7000;
输出
得到的结果如下:
ADDRESS | MAX_SALARY |
---|---|
Bhopal | 8500.00 |
Indore | 10000.00 |