ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用

知识点:

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第1张图片

统计函数:
COUNT()、SUM()、MIN()、MAX()、AVG()

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第2张图片

这些统计函数是允许和其它函数嵌套的

例:统计出企业员工的平均雇佣年限

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第3张图片

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第4张图片

以上的几个操作函数,在表中没有数据的时候,只要COUNT()函数会返回结果,其它都是Null

可见只有COUNT()函数会返回最终的结果,即使没有数据也返回0,而其他的都是null

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第5张图片

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第6张图片

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第7张图片

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第8张图片

分组统计

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第9张图片

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第10张图片

例:根据部门编号分组,查询出每个部门的编号、人数、平均工资

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第11张图片

例:根据职位分组,统计出每个职位的人数,最低工资与最高工资

实际上GROUPBY子句之所以使用麻烦,是因为分组的时候有一些约定条件:

如果查询不使用GROUPBY子句,那么SELECT子句只允许出现统计函数,其它任何字段不允许出现

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第12张图片

如果查询中使用了GROUPBY子句,那么SELECT中只允许出现分组字段,统计函数,其它都不允许出现。

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第13张图片

统计函数允许潜嵌套,但是嵌套之后的SELECT子句里面只允许出现嵌套,而不允许出现任何字段,包括分组字段。

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第14张图片

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第15张图片

多表查询与分组统计(重点)

对于GROUP BY 子句而言实在WHERE子句之后执行的,所以在使用时可以进行限定查询

例:查询出每个部门的名称、部门人数、以及平均工资

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第16张图片

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第17张图片

第二步:此时的查询结果中,对于部门名称出现了重复的内容,按照分组来讲,只要是出现了重复,就可以进行分组,只不过此时的分组是针对于临时表(查询结果),既然已经确定了dname上存有重复记录,故直接针对于dname分组即可

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第18张图片

HAVING子句

现在要求查询每个职位的名称,职位的平均工资,但是要求显示的职位的工资高于2000即可,即按照职位先进行分组,同时统计出每个职位的平均工资,随后要求显示那些平均工资高于2000的职位信息,对要显示的数据进行筛选,自然就会想到WHERE子句,余数就写了如下代码。

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第19张图片

直接告诉用户WHERE子句上不允许出现统计函数(分组函数),因为GROUP BY 是在WHERE子句之后执行的,那么此时执行WHERE子句时还没有进行分组,无法进行统计。此情况必须使用另外一个子句完成,HAVING子句,而此时的SQL语法变成如下形式:

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第20张图片

例:使用HANVING子句

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第21张图片

关于WHERE与HAVING的区别:

WHERE子句是在GROUP BY 分组之前进行筛选的,指的是选出那些可以参入分组的数据。并且WHERE子句中不允许出现统计函数。

HAVING子句是在GROUP BY 分组之后进行的,可以使用统计函数。

分组案例

例1:显示所有非销售人员的工作名称以及从事同一工作的雇员的月工资的总和,并且要求满足从事同一工作雇员的月工资的总和大于5000,显示结果按照月工资的合计的升序排列。

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第22张图片

第二步:按照职位进行分组,之后求出月工资的总支出

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第23张图片

第三步:分组后的数据进行再次筛选,使用HAVING子句

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第24张图片

第四步:按照月工资的合计升序排列,使用ORDER BY

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第25张图片

例:统计所有领取佣金和不领取佣金人员的人数,平均工资

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第26张图片

使用GROUP BY的时候,会把每个种子值当作一个分组,所以此时不可能直接使用GROUP BY

现在可以换一个思路,把问题拆分一下:

查询出所有领取佣金的雇员的人数,平均工资。直接使用WHERE子句,都不用GROUP BY

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第27张图片

查询出所有不领取佣金的雇员的人数,平均工资。直接使用WHERE子句,都不用GROUP BY

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第28张图片

此时两个查询结果返回的结构完全相同,直接连接即可

ORACLE:分组统计函数(COUNT()、SUM()、AVG()、MAX()、MIN())的使用_第29张图片

你可能感兴趣的:(数据库)