Oracle

您所在的位置:网站首页 怎么计算组数的个数 Oracle

Oracle

2024-07-08 15:12| 来源: 网络整理| 查看: 265

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

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

文章目录 1、统计函数(分组函数)1.1 范例1:验证各个函数1.2 范例2:统计出公司的平均雇佣年限1.3 范例3:求出最早和最晚的雇佣日期1.4 范例4:统计bonus表1.5 范例5:统计bonus表 2、分组统计2.1 范例1:根据部门编号分组,查询每个部门的编号、人数、平均工资2.2 范例2:根据职位分组,统计出每个职位的人数,最低工资与最高工资

🚴大家好!我是近视的脚踏实地,这篇文章主要是来学习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子句&分组案例

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3