上一篇👉: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子句&分组案例
本篇博客到这就完啦,非常感谢您的阅读🙏,如果对您有帮助,可以帮忙点个赞或者来波关注鼓励一下喔😬 ,嘿嘿👀