SELECT: HAVING

说明

对分组的结果进行条件判断

语法

select_having ::=

参数

condition

一个结果为布尔类型的表达式。

注解

HAVING子句对GROUP BY子句输出的每个组计算HAVING条件,若结果为TRUE,则输出该组中的所有行,若结果为FALSE,则忽略该组中的所有行。

虽然HAVING子句与WHERE子句有相同的形式,意义却有很大的不同。WHERE子句用于在分组之前对FROM子句的输出进行过滤,其条件是针对每一个单独的行进行衡量的,因此其中不允许出现聚集函数(除非来自于父查询);HAVING子句用于在分组之后对GROUP BY子句的输出进行过滤,其条件是针对一个组中的所有行进行衡量的,因此其中可以包含聚集函数,但不能引用那些不在GROUP BY子句中的字段,如:

SELECT ... FROM STUDENT GROUP BY SDEPT HAVING SGENDER = 'M';

是一合法的。

示例

示例1: 对分组的结果进行判断

--  清理环境
DROP TABLE tab1 CASCADE;


--  创建表并插入数据
CREATE TABLE tab1 (a INT, b INT, c INT);

INSERT INTO tab1 VALUES(1, 10, 900);
INSERT INTO tab1 VALUES(2, 20, 500);
INSERT INTO tab1 VALUES(2, NULL, 200);
INSERT INTO tab1 VALUES(3, 30, 1000);


SELECT * FROM tab1 ORDER BY a, b, c;
A(int)      |B(int)      |C(int)      |
------------------------------------
1           |10          |900         |
------------------------------------
2           |20          |500         |
------------------------------------
2           |null        |200         |
------------------------------------
3           |30          |1000        |
总数目:4



--  对分组的结果进行判断
SELECT a, COUNT(*) FROM tab1 GROUP BY a HAVING COUNT(*) >= 2;
A(int)      |COUNT(int)      |
----------------------------
2           |2               |
总数目:1


--  删除表
DROP TABLE tab1;