Oracle-----统计函数&分组统计(group by)

上一篇👉:Oracle-----SQL-1999语法&数据集合操作


总目录👉震惊!史上最菜的Oracle 11g教程(大佬勿进)


🚴大家好!我是近视的脚踏实地,这篇文章主要是来学习Oracle的统计函数以及分组统计
     唯有行动  才能解除你所有的不安

1、统计函数(分组函数)

之前学习过一个count()函数,这个函数的主要作用是统计一张数据表之中的数据量的个数。但是与它功能类似的常用函数一共有五个:Oracle统一还有很多,这5个函数所有的数据库都包含
     ※统计个数:count(),根据表中的实际数据量返回结果;
     ※求和:sum(),是针对于数字的统计
     ※平均值:avg(),是针对于数字的统计
     ※最小值:min(),各种数据类型都支持
     ※最大值:max(),各种数据类型都支持

1.1 范例1:验证各个函数

范例1: 验证各个函数

select count(*) 人数,avg(sal) 员工平均工资,sum(sal) 每月总支出,
		max(sal) 最高工资, min(sal) 最低工资
from emp;

在这里插入图片描述
但是这些统计函数是允许和其他函数嵌套的。

1.2 范例2:统计出公司的平均雇佣年限

范例2: 统计出公司的平均雇佣年限

select avg(months_between(sysdate,hiredate)/12)
from emp;

在这里插入图片描述

1.3 范例3:求出最早和最晚的雇佣日期

范例3: 求出最早和最晚的雇佣日期(找到公司最早雇佣的雇员,以及公司最近雇佣的雇员日期)

select max(hiredate) 最晚, min(hiredate) 最早
from emp;

在这里插入图片描述

1.4 范例4:统计bonus表

范例4: 统计bonus表

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

我们知道表bonus是没有任何数据的,可以看到里边有四个字段👇:
在这里插入图片描述
那么我们做如下尝试👇:

select count(*) 人数,avg(sal) 员工平均工资,sum(sal) 每月总支出,
		max(sal) 最高工资, min(sal) 最低工资
from bonus;

在这里插入图片描述
可以清楚的发现,此时只有count()函数会返回最终的结果。即使没有数据也会返回0,而其他的函数统计的结果都是null

实际上针对于count()函数有三种使用形式:
     count(*): 可以准确的返回表中的全部记录数
     count(字段): 统计不为null 的所有数据量
     count(distinct 字段): 消除重复数据之后的结果

首先来回忆一下emp表中有14条记录
在这里插入图片描述

1.5 范例5:统计bonus表

范例5: 统计查询一

select count(*),count(empno)
from emp;

在这里插入图片描述
那么comm字段是有null的,同样是可以查询出来的

select count(*),count(empno),count(comm)
from emp;

在这里插入图片描述
然后job的值是有相同的职位的,可以用distinct字段👇:

select count(distinct job)
from emp;

在这里插入图片描述

2、分组统计

什么情况下可能分组?
例如:部门之间进行拔河比赛,那么分组的依据:部门,每个雇员都有相同的部门编号;
例如:上厕所,男女各一边,实际上这也是一个分组。
那么也就证明一点:分组的前提是存在有重复。但是允许单独一行记录进行分组。
如果要想进行分组则应该使用group by子句完成,那么此时的SQL语法结构变为如下形式👇:

【④选出所需要的数据列】select [distinct] * | 分组列 [别名],分组列 [别名],分组列 [别名]…
【①确定数据来源(行与列的集合)】from 表名称 [别名],表名称 [别名]…
【②筛选数据行】[where 限定条件(s)]
【③针对于筛选的行分组】[group by 分组字段,分组字段,分组字段…]
【⑤数据排序】[order by 排序字段 [ASC | DESC],排序字段 [ASC | DESC],…]

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

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

select deptno,count(*),avg(sal)
from emp
group by deptno;

在这里插入图片描述

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

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

select job,count(*),min(sal),max(sal)
from emp
group by job;

在这里插入图片描述
实际上group by子句之所有麻烦,是因为分组的时候有一些约定条件:
     ※ 如果查询不使用group by子句,那么select的子句中只允许出现统计函数,其他任何字段不允许出现

错误的代码正确的代码
select empno,count(*) from emp;
在这里插入图片描述
select count(*) from emp;
在这里插入图片描述

     ※如果查询中使用了group by子句,select子句中只允许出现分组字段、统计函数,其他任何字段都不允许出现

错误的代码正确的代码
select ename,job,count(*) from emp group by job;
在这里插入图片描述
select job,count(*) from emp group by job;
在这里插入图片描述

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

错误的代码正确的代码
select deptno,max(avg(sal)) from emp group by deptno;
在这里插入图片描述
select max(avg(sal)) from emp group by deptno;
在这里插入图片描述

其实第三种方式的原理就是首先如果先用**select deptno,avg(sal) from emp group by deptno;**语句查询出来的是一张表了
在这里插入图片描述

然后接着从查询的这张表再次使用统计函数查询出平均工资最高的,即语句select max(avg(sal)) from emp group by deptno; 此时就回到了第一个概念,此时查询平均工资最高的的这个表不需要在进行分组了,直接查就好了,所以是不允许再出现任何字段,包括第一步的分组字段deptno


下一篇👉Oracle-----多表查询与分组统计&having子句&分组案例

本篇博客到这就完啦,非常感谢您的阅读🙏,如果对您有帮助,可以帮忙点个赞或者来波关注鼓励一下喔😬 ,嘿嘿👀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值