Oracle实践|内置函数之聚合函数

在这里插入图片描述

📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师
🏆 近期荣誉:华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员
🔥 三连支持:欢迎 ❤️关注、👍点赞、👉收藏三连,支持一下博主~

文章目录

  • 序言
    • 背景说明
    • 示例环境
    • 测试数据
  • 2 聚合统计函数
    • 计数--COUNT
    • 求和--SUM
    • 平均--AVG
    • 最大/小值--MAX/MIN
    • 分组统计
      • ROLLUP 多维汇总
      • CUBE 多维汇总
    • 唯一性检查--DISTINCT
  • 总结

序言

背景说明

Oracle 数据库提供了丰富的内置函数,涵盖数值处理、字符串操作、日期和时间处理、逻辑判断、集合处理、数据分析、数据类型转换等多个方面。上一个章节学习了数学类的函数,本章节想学习下分析类函数。下面就随着我一起来学习下这个内置函数吧,有解释不到之处,还望批评指正。
聚合函数对一组值进行计算,并返回单个值。它们通常与GROUP BY子句一起使用,用于汇总数据。在Oracle中,常见的聚合函数有:个数、和、平均数、最大值、最小值等。聚合函数通常是我们分析数据或者统计数据时较为常用。
在这里插入图片描述

示例环境

本篇示例是基于Oracle DB 19c EE (19.17.0.0.0)版本操作,所操作的环境依旧是oracle提供的在线测试环境。如果有不同之处,请指出。
在这里插入图片描述

上次有同学咨询我说,这个在线操作的链接地址是多少,这里补充下:https://livesql.oracle.com/ 注册后登录即可食用,方便快捷,用作测试是一个不错的选择。

测试数据

为了演示,下面创建一张员工表(employees),然后插入一些数据来进行测试。

--- 创建表结构
CREATE TABLE employees (
    employee_id NUMBER(6) NOT NULL,
    first_name VARCHAR2(20),
    last_name VARCHAR2(25) NOT NULL,
    email VARCHAR2(25) NOT NULL,
    phone_number VARCHAR2(15),
    hire_date DATE NOT NULL,
    job_id VARCHAR2(10) NOT NULL,
    salary NUMBER(8,2),
    commission_pct NUMBER(2,2),
    manager_id NUMBER(6),
    department_id NUMBER(4),
    CONSTRAINT employees_pk PRIMARY KEY (employee_id)
);
--- 给字段增加注释信息
COMMENT ON TABLE employees IS '员工信息表';
COMMENT ON COLUMN employees.employee_id IS '员工ID';
COMMENT ON COLUMN employees.first_name IS '员工名';
COMMENT ON COLUMN employees.last_name IS '员工姓';
COMMENT ON COLUMN employees.email IS '员工邮箱';
COMMENT ON COLUMN employees.phone_number IS '员工电话';
COMMENT ON COLUMN employees.hire_date IS '雇佣日期';
COMMENT ON COLUMN employees.job_id IS '工作ID';
COMMENT ON COLUMN employees.salary IS '员工薪资';
COMMENT ON COLUMN employees.commission_pct IS '佣金';
COMMENT ON COLUMN employees.manager_id IS '上级经理ID';
COMMENT ON COLUMN employees.department_id IS '部门ID';

--- 插入几条测试数据
INSERT INTO employees (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id)
VALUES (101, 'John', 'Doe1', 'john.doe1@example.com', '123-4561', TO_DATE('2000-01-01', 'YYYY-MM-DD'), 'IT_PROG', 60000, NULL, 200789, 50);
INSERT INTO employees (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id)
VALUES (102, 'John', 'Doe2', 'john.doe2@example.com', '123-4562', TO_DATE('2000-02-01', 'YYYY-MM-DD'), 'IT_PROG', 20000, NULL, 200789, 10);
INSERT INTO employees (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id)
VALUES (103, 'John', 'Doe3', 'john.doe3example.com', '123-4563', TO_DATE('2000-03-01', 'YYYY-MM-DD'), 'IT_PROG', 30000, NULL, 200789, 10);
INSERT INTO employees (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id)
VALUES (104, 'John', 'Doe4', 'john.doe4@example.com', '123-4564', TO_DATE('2000-04-01', 'YYYY-MM-DD'), 'IT_PROG', 90000, NULL, 200799, 20);

万事俱备,下面就开始学习之旅吧。
在这里插入图片描述

2 聚合统计函数

计数–COUNT

这个函数必须常用,可以说每一个项目都不可以缺少的一个函数,却少了这个函数都感觉写的代码没灵魂了。计数函数是计算命中的行数,常常被用作聚合或分析函数。通常情况下,此函数还会结合DISTINCT使用,在面试的笔试题的时候,我记得经常遇到这种类型的题目。
【定义】

COUNT(*):计算行数,需要扫描表,性能一般。
COUNT(1):计算行数,不需要扫描表,性能较快。
COUNT(column):计算非NULL值的个数,扫描非NULL的列,性能较快。
COUNT(DISTINCT column):计算某一列中不同值的数量,它会跳过重复的值,只计算不同的值,由于DISTINCT会使用排序,所以性能较慢。

【使用场景】
COUNT函数除了会在列上做统计使用之外,还可以在WHERE子句、HAVING子句、ORDER BY子句中使用,这有点类似TO_CHAR和TO_DATE,不同的场景使用情况下,性能不同。后续再做一篇专门性的博文来讲述这些函数。

【示例】
例如
1、老板想知道,员工数量;
2、老板想知道给多少员工发薪资的范围在60000元以上,查询薪资大于>= 60000的员工数;
3、老板还想知道每个经理下面有多少员工数
等等。

--- 查询员工数量
SELECT COUNT(1) FROM employees t1;
--- 查询薪资大于60000的(salary >= 60000)员工数量
SELECT COUNT(1) FROM employees t1 WHERE t1.salary >= 60000;
--- 查询 每个经理下员工的数量
SELECT COUNT(1), manager_id FROM employees t1 GROUP BY manager_id;

在这里插入图片描述

求和–SUM

比较常用的一个内置函数,例如你是一个老板,你的员工中每个经理的累计工资总额,当然你也可以将工资都导入到Excle中使用Excel的SUM函数来计算,哈哈哈~。
【定义】

SUM(column):计算数值列的总和,在计算过程中,SUM函数会忽略这些NULL值进行计算。

【使用场景】
SUM函数还可以与其他SQL函数(如GROUP BY、HAVING等)结合使用,以执行更复杂的查询和计算。此外,SUM函数还常用于分析类的统计,统计结果集的每一行中计算累积总和。

【示例】
看了每个员工情况,老板想知道这个月一共发出去多少薪资,那么这个函数就用到了。其次,老板还想知道每个部门有多少薪资发放。

SELECT SUM(salary) sumSalary FROM employees t1;
SELECT SUM(salary) sumSalary, department_id FROM employees t1 GROUP BY department_id;

在这里插入图片描述

平均–AVG

同上面几个函数一样,这个函数除了会计算工资之外,还会在面试的笔试题中计算工资,当然了,学习这些函数也是让我们在工作中以备不时之需。使用时可以参考SUM 函数。
【定义】

AVG(column):计算数值列的平均值。

【示例】
分析全部员工的平均薪资、分析某一个部门员工的平均薪资

-- 分析全部员工的平均薪资(我们都是被平均的那个)
SELECT AVG(salary) FROM employees;
-- 分析某一个部门员工的平均薪资
SELECT AVG(salary) FROM employees WHERE department_id = 10;

在这里插入图片描述

最大/小值–MAX/MIN

常用获取一组数据中最大值和最小值的函数。
【定义】

MAX(column):返回数值列的最大值。
MIN(column):返回数值列的最小值。

【示例】
在这里插入图片描述

分组统计

分组统计也是在统计学中常用的函数,这些函数我也不是很常用,所以不是很了解。
【定义】

GROUPING SETS, ROLLUP, CUBE: 多维汇总。

ROLLUP 多维汇总

有些场景,例如我们分组完后,还想知道总薪资是多少,那么这个函数可以帮助你(为了方便演示,这里也查询出来了所有数据)。ROLLUP函数结果集中最后一列返回NULL,表示对所有分组列进行汇总。
举例说明:按照领导分组,看下哪一个管理者手下薪资总和情况,顺便也把纳入计算的薪资统计下。下面就是一个很好的例子。

SELECT SUM(salary), manager_id 
FROM employees
GROUP BY ROLLUP ( manager_id ); 

在这里插入图片描述

CUBE 多维汇总

现在有个需求,想要统计每个部门编号以及部门中员工的数量,下面使用 GROUP BY 和 GROUP BY CUBE 分别统计,可以看出来区别吧。

SELECT count(department_id), department_id  FROM employees GROUP BY department_id;

SELECT count(department_id), department_id  FROM employees GROUP BY CUBE(department_id);

在这里插入图片描述

唯一性检查–DISTINCT

重复性的数值列不再统计。
【定义】

COUNT(DISTINCT column):计算列中唯一值的数量。

【使用场景】
DISTINCT可以与ORDER BY子句一起使用,以对结果进行排序。例如多次考试,我们只会获取考试通过的一次。

【示例】
查询每个部门里面最高工资

SELECT COUNT(DISTINCT department_id), MAX(SALARY)  FROM employees GROUP BY department_id; 

在这里插入图片描述

总结

我也想学习一下大佬,每日学习一点知识,丰富自己的脑子,至少知道自己写了点啥。后续有发现缺少或者缺失的再做补充。


欢迎关注博主 「六月暴雪飞梨花」 或加入【六月暴雪飞梨花社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/647785.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SRE视角下的DevOps:构建稳定高效的软件交付流程

SRE 和 DevOps 有什么区别和联系?本文对此进行了解读,并着重从 SRE 实践出发阐述了 DevOps 的建设思路。 SRE 就是在用软件工程的思维和方法论完成以前由系统管理员团队手动完成的工作。SRE 的职责是运维一个服务,该服务由一些相关的系统组件…

解决vue3 vite打包报Root file specified for compilation问题

解决方法: 修改package.json打包命令 把 "build": "vue-tsc --noEmit && vite build" 修改为 "build": "vite build" 就可以了 另外关于allowJs这个问题,在tsconfig.json文件中配置"allowJs&qu…

基于深度学习和opencv的车牌识别系统

免费获取方式↓↓↓ 项目介绍028: 基于深度学习和opencv的车牌识别系统 同时利用对图片每一帧图像加入视频分析模块 图片分析模块可以依据界面按钮提示进行相应功能 视频分析模块可以根据按钮提示进行对视频的分析 (视频模块的视频追踪处理时间较长&…

JVM之【运行时数据区】

JVM简图 运行时数据区简图 一、程序计数器(Program Counter Register) 1.程序计数器是什么? 程序计数器是JVM内存模型中的一部分,它可以看作是一个指针,指向当前线程所执行的字节码指令的地址。每个线程在执行过程中…

AI预测体彩排3采取888=3策略+和值012路一缩定乾坤测试5月26日预测第2弹

今天继续基于8883的大底进行测试,昨天的预测已成功命中!今天继续测试,按照排三前面的规律,感觉要出对子了,所以本次预测不再杀对子,将采用杀一个和尾来代替。好了,直接上结果吧~ 首先&#xff0…

访问tomcat的webapps下war包,页面空白

SpringBootvue前后端分离项目,Vue打包到SpringBoot中 常见问题 错误一:war包访问页面空白 前提:项目在IDEA里配置tomcat可以启动访问项目 但是,打成war包拷贝到tomcat webapps下能启动却访问不了,页面显示空白 原…

YAML详情

一、kubernetes支持对象 Kubernetes支持YAML和JSON格式管理资源对象 JSON格式:主要用于api接口之间消息的传递YAML格式:用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化,较易读 二、YAML语法格式注意点 …

LeetCode热题100—链表(一)

160.相交链表 题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意&#x…

【css3】06-css3新特性之网页布局篇

目录 伸缩布局或者弹性布局【响应式布局】 1 设置父元素为伸缩盒子 2 设置伸缩盒子主轴方向 3 设置元素在主轴的对齐方式 4 设置元素在侧轴的对齐方式 5 设置元素是否换行显示 6 设置元素换行后的对齐方式 7 效果测试原码 伸缩布局或者弹性布局【响应式布局】 1 设置父元…

C#屏蔽基类成员

可以用与积累成员名称相同的成员来屏蔽 要让编译器知道你在故意屏蔽继承的成员,可以用new修饰符。否则程序可以成功编译,但是编译器会警告你隐藏了一个继承的成员 using System;class someClass {public string F1 "Someclass F1";public v…

ISIS协议

isis协议基础 isis概述 isis:中间系统到中间系统isis是公有协议,属于IGP协议,主要应用于一个AS(企业)自治系统内部isis是一种链路状态协议,使用SPF算法早期的isis是基于CLNP(无连接网络协议&a…

【知识蒸馏】feature-based 知识蒸馏 - - CWD(channel-wise knowledge dissillation)

一、CWD特征蒸馏介绍 大部分的KD方法都是通过algin学生网络和教师网络的归一化的feature map, 最小化feature map上的激活值的差异。 逐通道知识蒸馏(channel-wise knowledge dissillation, CWD)将每个通道的特征图归一化来得到软概率图。通过简单地最小…

一款颜值颇高的虚拟列表!差点就被埋没了,终于还是被我挖出来了

大家好,我是晓衡! 今天,推荐一款颇有颜值的虚拟列表组件,不然真的被埋没就可惜了! 我们先来看下效果: 感觉怎么样?还不错吧! 为什么说这个资源差点被埋没呢?因为个朋友找…

Java面向对象知识总结+思维导图

🔖面向对象 📖 Java作为面向对象的编程语言,我们首先必须要了解类和对象的概念,本章的所有内容和知识都是围绕类和对象展开的! ▐ 思维导图1 ▐ 类和对象的概念 • 简单来说,类就是对具有相同特征的一类事…

【全开源】多功能投票小程序(ThinkPHP+FastAdmin+Uniapp)

打造高效、便捷的投票体验 一、引言 在数字化快速发展的今天,投票作为一种常见的决策方式,其便捷性和效率性显得尤为重要。为了满足不同场景下的投票需求,我们推出了这款多功能投票小程序系统源码。该系统源码设计灵活、功能丰富&#xff0…

《AI学习笔记》大模型-微调/训练区别以及流程

阿丹: 之前一直对于大模型的微调和训练这两个名词不是很清晰,所有找了一个时间来弄明白到底有什么区别以及到底要怎么去使用去做。并且上手实践一下。 大模型业务全流程: 大模型为啥要微调?有哪些微调方式? 模型参数…

Jeecg | 如何解决 ERR Client sent AUTH, but no password is set 问题

最近在尝试Jeecg低代码开发,但是碰到了超级多的问题,不过总归是成功运行起来了。 下面说说碰到的最后一个配置问题:连接redis失败 Error starting ApplicationContext. To display the conditions report re-run your application with deb…

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与单片机连接的按键的按键值的功能

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与单片机连接的按键的按键值应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍TM1638键盘数码…

【设计模式】JAVA Design Patterns——Static Content Hosting(静态内容托管模式)

🔍目的 将静态内容部署到基于云的存储服务,该服务可以将它们直接交付给客户端。 这可以减少对昂贵计算实例的需求。 🔍解释 真实世界例子 全球性的营销网站(静态内容)需要快速的部署以开始吸引潜在的客户。为了将托管…

【STL】C++ vector基本使用

目录 一 vector常见构造 1 空容器构造函数(默认构造函数) 2 Fill 构造函数 3 Range 构造函数 4 拷贝构造函数 5 C11构造 二 vector迭代器 1 begin && end 2 rbegin && rend 3 补充排序 三 vector 容量操作 1 size 2 resize …