聚集函数

聚集函数作用于一组值以返回单个标量值。 可在查询和子查询方法中使用这些函数。

以下示例演示聚集:

SELECT  SUM (e.salary) FROM EmpBean e WHERE e.dept.deptno =20

此聚集计算部门 20 的总月薪。

聚集函数是 AVG、COUNT、MAX、MIN 和 SUM。 以下示例演示聚集函数的语法:

aggregation-function  ( [ ALL |  DISTINCT ]  expression )

或:

COUNT( [ ALL |  DISTINCT ] identification-variable )

或:

COUNT( * )

在应用函数之前,DISTINCT 选项消除重复值。 ALL 是缺省选项,并且不消除重复。 计算聚集函数时,除了 COUNT(*) 和 COUNT(identification-variable)(它们返回此集合中的所有元素的计数值),空值都被忽略。

如果您的数据存储是 Informix,那么当使用 COUNT 函数或 SUM、AVG、MIN 和 MAX 函数的 DISTINCT 格式时,必须将表达式自变量限定为单个值的路径表达式。

定义返回类型

对于使用聚集函数的选择方法,您可以将返回类型定义为基本类型或包装器类型。 返回类型必须与来自数据存储的返回类型兼容。 MAX 和 MIN 函数可以应用于任何数字、字符串或日期时间数据类型并返回相应的数据类型。 SUM 和 AVG 函数采用数字类型作为输入,并返回数据存储中使用的同一数字类型。 COUNT 函数可以采用任何数据类型,并返回整数。

应用于空集时,SUM、AVG、MAX 和 MIN 函数可以返回 null 值。 COUNT 函数应用于空集时,它返回零(0)。 如果返回值可能是 NULL,那么使用包装器类型;否则,容器会显示 ObjectNotFound 异常。

使用 GROUP BY 和 HAVING

用于聚集函数的值集由查询的 FROM 和 WHERE 子句产生的集合确定。 您可以将该集合分成几个组,并将聚集函数应用于每个组。 要执行此操作,请在查询中使用 GROUP BY 子句。 GROUP BY 子句定义组成路径表达式列表的分组成员。 每个路径表达式指定作为基本类型(byte、short、int、long、float、double、boolean、char)或包装器类型(Byte、Short、Integer、Long、Float、Double、BigDecimal、String、Boolean、Character、java.util.Calendar、java.util.Date、java.sql.Date、java.sql.Time 或 java.sql.Timestamp)的字段。

以下示例描述计算每个部门的平均月薪的查询中 GROUP BY 子句的使用:

SELECT e.dept.deptno,  AVG ( e.salary) FROM EmpBean e GROUP BY e.dept.deptno

将集合分为若干组时,一个 NULL 值被认为等于另一个 NULL 值。

正如 WHERE 子句从 FROM 子句过滤元组(即,返回多值的记录),可以使用测试组属性(涉及聚集函数或分组成员)的 HAVING 子句来过滤组:

SELECT e.dept.deptno,  AVG ( e.salary) FROM EmpBean e 
GROUP BY e.dept.deptno
HAVING  COUNT(*) > 3  AND  e.dept.deptno > 5

此查询返回员工超过 3 人且部门编号大于 5 的部门的平均月薪。

可以使用不带 GROUP BY 子句的 HAVING 子句,在此情况下将整个集合视为应用 HAVING 子句的单个组。