7.组函数及分组统计

应用:例如,把男生分成一组,女生一组,然后求出每一组的平均身高、年龄,这就要用到分组函数

1)组函数

在SQL常用的组函数有:

COUNT():求出全部的记录数

MAX():求出一组中最大值

MIN():求出一组中最小值

AVG():求出平均值

SUM():求和

范例:

SELECT COUNT(empno) FROM emp;

SELECT MIN(sal) FROM emp;

SELECT MAX(sal) FROM emp;

求出20部门的总工资

SELECT SUM(sal) FROM emp WHERE deptno=20;

求出所有员工的平均工资

SELECT AVG(sal) FROM emp;

  1. 分组统计

a)GROUP BY

要想使用分组统计,则首先应该固定其语法,使用GROUP BY

SELECT DISTINCT *|列名 别名

FROM 表名

{WHERE 条件(s)}

{GROUP BY分组条件{HAVING 分组条件}}

{ORDER BY 排序的字段1,排序的字段2 ASC|DESC}

范例:求出每个部门的雇员数量,即按照部门编号分组

SELECT deptno, COUNT(sal)

FROM emp

GROUP BY deptno;

范例:求出每个部门的平均工资

SELECT deptno, AVG(sal)

FROM emp

GROUP BY deptno;

注意:观察以下代码

Oracle从零开始06——SQL语句05——组函数与分组统计_从零开始Oracle从零开始06——SQL语句05——组函数与分组统计_Oracle_02

在查询的时候以上代码不能正确执行,是因为:

1.如果程序中使用了分组函数,则有两种可以使用的情况:

程序中存在了GROUP BY并指定了分组条件 ,这样可以将分组条件一起查询出来;

如果不使用分组的话,则只能单独的使用组函数

2.在使用分组函数的时候,不能出现分组函数和分组条件之外的字段

范例:

SELECT deptno,empno,COUNT(empno)

FROM emp

GROUP BY deptno;

Oracle从零开始06——SQL语句05——组函数与分组统计_统计_03

此时,提示empno不是GROUP BY表达式,所以无法使用

分组统计也支持多表查询

范例:按部门分组,并显示部门名称以及员工数

Oracle从零开始06——SQL语句05——组函数与分组统计_Oracle_04

范例:要求显示出平均工资大于2000的部门编号及平均工资

Oracle从零开始06——SQL语句05——组函数与分组统计_从零开始_05

3.分组函数只能在分组中使用,不允许在WHERE语句中出现,如果要指定分组条件,只能用HAVING

b)HAVING

使用HAVING完成以上操作

Oracle从零开始06——SQL语句05——组函数与分组统计_06_06

范例:显示非销售人员工作名称以及从事同一工作雇员的月工资的综合,并且要满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资的合计降序排列。

第一步、显示全部的非销售人员

SELECT *

FROM emp

WHERE job<>'SALESMAN';

Oracle从零开始06——SQL语句05——组函数与分组统计_统计_07

第二步、按工作分组,同时求出工资的总和

SELECT job,SUM(sal)

FROM emp

WHERE job<>'SALESMAN'

GROUP BY job;    

Oracle从零开始06——SQL语句05——组函数与分组统计_06_08

第三步、对分组的条件进行限制,工资总和大于5000

SELECT job,SUM(sal)

FROM emp

WHERE job<>'SALESMAN'

GROUP BY job HAVING SUM(sal)>5000;

Oracle从零开始06——SQL语句05——组函数与分组统计_Oracle_09

第四步、使用排序,按降序

SELECT job,SUM(sal)

FROM emp

WHERE job<>'SALESMAN'

GROUP BY job HAVING SUM(sal)>5000

ORDER BY SUM(sal) DESC;

Oracle从零开始06——SQL语句05——组函数与分组统计_Oracle_10

分组的简单原则:只要一列上存在重复的内容才有可能考虑到分组

注意:分组函数可以嵌套使用,但是在组函数嵌套使用的时候不能再出现分组条件的查询语句。

范例:求出平均工资最高的部门工资

错误的代码:分组条件deptno不能出现在查询语句中

Oracle从零开始06——SQL语句05——组函数与分组统计_06_11

正确的代码:

Oracle从零开始06——SQL语句05——组函数与分组统计_统计_12