分组函数简单的说就是一个函数作用于一组数据,并对这组数据进行处理然后返回一个结果值。比如求平均数或者求和就可以用到分组函数求值。常用的分组函数有五个:平均值(AVG)、个数(COUNT)、总和(SUM)、最大值(MAX)、最小值(MIN)。
EMPLOYEES表
一、组函数
EMPLOYEES表中有记录工资(SALARY)的列。对于工资,也可以说是对于数字,就会有对数字的计算,这时候就可以用到组函数来进行计算。
这里的工资就可以把全部的组函数都用上。但是需要注意的是组函数所操作的数据是不包括空值的,EMPLOYEES表中的佣金(COMMISSION_PCT)就有空值的数据,下面就用佣金的空值来说明这个问题。
平均值的计算就是先把要求的值求和之后再除以该值的总数。在EMPLOYEES表中有107条数据,这里的求平均值就只用35条数据,也就是佣金不为空值的数据来进行计算,结果与用AVG分组函数一样。说明组函数所操作的数据是不包括空值的。
对于这种情况就要用上通用函数的NVL来将空值转换成一个指定的值。这样就可以用所有人的工资来计算平均值,包括空值那部分。同时用分组函数时要注意对应数据类型。
二、分组(GROUP BY)
分组函数顾名思义就是用来分组的,这五个常用的分组函数返回的都是一个值,要想达到分组的效果还需要用到GROUP BY子句。使用GROUP BY子句是有前提的,即在SELECT子句中要含有分组函数,同时在SELECT列表中所有未包含在组函数中的列都应该包含在GROUP BY子句中(如下左图),而包含在 GROUP BY 子句中的列可以不必包含在SELECT列表中(如下右图)。
三、过滤(HAVING)
分组完成之后就是对数据的过滤,SELECT子句用上的分组函数是无法通过WHERE子句来进行过滤的。这时候就需要用到HAVING子句,使用HAVING过滤分组的前提是数据已经被分过组且用上了分组函数。