分组与聚合:
聚合函数
聚合操作用来完成对一组指定数据进行聚合计算,完成聚合计算的函数主要
有:
! MIN 求最小值,计算中忽略空值。
! MAX 求最大值,计算中忽略空值。
! SUM 求合计,计算中忽略空值。
! COUNT 返回个数,计算中包括空值。
! AVG 求平均值,计算中忽略空值。
利用GROUP BY和聚合函数可以实现分组累计。举例来说,如果要求显示各
个部门的薪水合计,可以使用下面的语句。
SELECT department_number
,SUM (salary_amount)
FROM employee
GROUP BY department_number;
需要注意的是,在SELECT子句中不作分组累计的所有字段必须出现在
GROUP BY子句中
以上例来说,Department_Number字段未作累计,因此它必须出现在GROUP
BY子句中。这条基本规则必须牢记。
WHERE子句和GROUP BY子句
WHERE子句和GROUP BY子句同时使用时,GROUP BY只对符合WHERE限
制的数据记录进行分组聚合计算。换言之,在作真正的聚合计算之前,WHERE子
句将不符合条件的数据记录剔除了。
例:部门401和403的合计薪水是多少?
SELECT department_number
,SUM (salary_amount)
FROM employee
WHERE department_number IN (401, 403)
GROUP BY department_number
;
GROUP BY和ORDER BY
在GROUP BY后加上ORDER BY,可以使得分组统计按照指定的秩序来显
示。例如,按部门编号顺序显示部门人数、合计薪水、部门最高薪水、部门最底薪
水和部门平均薪水,可以使用下面的SQL语句:
SELECT department_number (TITLE 'DEPT')
,COUNT (*) (TITLE '#_EMPS')
,SUM (salary_amount) (TITLE 'TOTAL')
(FORMAT 'zz,zzz,zz9.99')
,MAX (salary_amount) (TITLE 'HIGHEST')
(FORMAT 'zz,zzz,zz9.99')
,MIN (salary_amount) (TITLE 'LOWEST')
(FORMAT 'zz,zzz,zz9.99')
,AVG (salary_amount) (TITLE 'AVERAGE')
(FORMAT 'zz,zzz,zz9.99')
FROM employee
GROUP BY department_number
ORDER BY department_number
;
当GROUP BY中有多个字段时,它只能产生一个级别
的汇总,而且是按照最后一个字段(这里是job_code)来进行汇总。
GROUP BY和HAVING条件限定
HAVING条件子句是和GROUP一起使用的,用来对分组统计的结果进行限
定,只返回满足其条件的分组统计结果。
举例来说,按部门编号顺序显示部门人数、合计薪水、部门最高薪水、部门
最低薪水和部门平均薪水,条件是只显示部门平均薪水小于36000的部门。
SELECT department_number (TITLE 'DEPT')
,COUNT (*) (TITLE '#_EMPS')
,SUM (salary_amount) (TITLE 'TOTAL')
(FORMAT 'zz,zzz,zz9.99')
,MAX (salary_amount) (TITLE 'HIGHEST')
(FORMAT 'zz,zzz,zz9.99')
,MIN (salary_amount) (TITLE 'LOWEST')
(FORMAT 'zz,zzz,zz9.99)
,AVG (salary_amount) (TITLE 'AVERAGE')
(FORMAT '