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

版权声明:转载请备注原文链接 https://blog.csdn.net/qq_40868987/article/details/85121246

知识点:

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

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

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

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

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

分组统计

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

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

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

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

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

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

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

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

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

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

HAVING子句

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

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

例:使用HANVING子句

关于WHERE与HAVING的区别:

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

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

分组案例

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

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

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

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

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

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_40868987/article/details/85121246