Oracle 数据库基础入门(四):分组与联表查询的深度探索(上)

在 Oracle 数据库的学习进程中,分组查询与联表查询是进阶阶段的重要知识点,它们如同数据库操作的魔法棒,能够从复杂的数据中挖掘出有价值的信息。对于 Java 全栈开发者而言,掌握这些技能不仅有助于高效地处理数据库数据,更是构建强大后端应用的关键。接下来,让我们深入探究这两个重要的数据库操作技巧。

目录

一、分组查询

(一)分组查询基础

(二)复合分组

(三)having 过滤


一、分组查询

(一)分组查询基础

分组查询允许我们根据指定的字段将数据进行分组,然后对每个组进行聚合统计操作。其语法结构为:

Select [字段列表] from  表的表名 [where 条件筛选] [order by 排序字段 asc/desc] [ group by 分组字段];

数据库的核心价值之一便是对数据进行聚合统计,以方便管理和分析。为了更好地理解分组查询,我们先创建一个goods_info表,并插入一些示例数据。

create table goods_info (id number primary key,                -- 商品id,主键good_name nvarchar2(100) not null,   -- 商品名称,不允许为空good_price number(10, 2) not null,   -- 商品价格,不允许为空good_store number,                    -- 库存数量good_sales number,                    -- 销量good_type nvarchar2(50),              -- 商品类型make_address nvarchar2(200)           -- 生产地地址
);-- 插入第1条数据
INSERT INTO goods_info (id, good_name, good_price, good_store, good_sales, good_type, make_address)
VALUES (1, '苹果iPhone 13', 6999.00, 100, 500, '手机', '中国深圳');-- 插入第2条数据
INSERT INTO goods_info (id, good_name, good_price, good_store, good_sales, good_type, make_address)
VALUES (2, '华为Mate 40 Pro', 7999.00, 50, 300, '手机', '中国深圳');-- 插入第3条数据
INSERT INTO goods_info (id, good_name, good_price, good_store, good_sales, good_type, make_address)
VALUES (3, '小米11 Ultra', 3999.00, 75, 450, '手机', '中国东莞');
-- 插入第4条数据
INSERT INTO goods_info (id, good_name, good_price, good_store, good_sales, good_type, make_address)
VALUES (4, '美的电饭煲', 1299.00, 200, 1500, '家用电器', '中国北京');-- 插入第5条数据
INSERT INTO goods_info (id, good_name, good_price, good_store, good_sales, good_type, make_address)
VALUES (5, '海尔洗衣机', 1599.00, 150, 1200, '家用电器', '中国北京');-- 插入第6条数据
INSERT INTO goods_info (id, good_name, good_price, good_store, good_sales, good_type, make_address)
VALUES (6, '索尼Xperia 1 III', 599.00, 100, 800, '手机', '中国东莞');-- 插入第7条数据
INSERT INTO goods_info (id, good_name, good_price, good_store, good_sales, good_type, make_address)
VALUES (7, '戴森吸尘器', 2999.00, 60, 350, '家用电器', '中国北京');-- 插入第8条数据
INSERT INTO goods_info (id, good_name, good_price, good_store, good_sales, good_type, make_address)
VALUES (8, '飞利浦空气净化器', 299.00, 500, 2000, '家用电器', '中国北京');

特别要注意的是,分组之后,select后面可以跟分组字段以及聚合函数。例如:

  • 按照商品类型,分别统计不同的商品类型有多少种对应的产品:
select good_type,count(*) from goods_info group by good_type;
  • 按照商品类型,分别统计不同的商品类型的最高价:
select good_type,max(good_price) from goods_info group by good_type;
  • 按照商品类型,分别统计不同的商品类型的最低价、平均价、总价:
selectgood_type,max(good_price) as maxPrice,min(good_price) as minPrice,avg(good_price) as avgPrice,sum(good_price) as sumPrice
fromgoods_info 
group bygood_type;

在 Java 全栈开发中,当我们开发一个电商数据分析模块时,可能会利用这些分组查询来统计不同商品类型的销售情况,然后通过 Java 代码将统计结果展示在前端页面上,为运营人员提供数据支持。

(二)复合分组

复合分组是在分组的基础上,进一步对数据进行分组。这就好比对书籍先按照类别分组,然后在每个类别中再按照作者分组。例如,按照商品类型和生产地,统计不同的商品类型在不同生产地分别有多少种对应的商品:

selectgood_type,make_address,count(*) 
fromgoods_info 
group bygood_type,make_address;

通过复合分组,我们可以获取更细致的数据统计信息。以下是一些练习题:

  • 按照学生姓名分组,统计不同的学生总分是多少,并按照总分进行降序排列:
selectname,sum( score ) as total 
fromstudent_exam_info 
group byname 
order bytotal desc;

  • 按照考试科目分组统计,不同科目最高分、最低分、平均分是多少:
select subject,max(score),min(score),avg(score) from student_exam_info group by subject;
  • 查询语文科目,不同的班级各自的平均分是多少:
select class_name,avg(score) from student_exam_info where subject = '语文' group by class_name;

(三)having 过滤

having关键字用于对聚合后的结果进行再次过滤。其语法为:

select [字段列表] from 表的表名 [where 条件筛选] [order by 排序字段 asc/desc] [group by 分组字段] [having 聚合过滤条件];

例如,按照学生姓名分组,统计不同的学生总分,只想看总分大于等于 260 以上的学生:

selectname,sum( score ) as total 
fromstudent_exam_info 
group byname 
having sum( score ) >= 260
order by total desc;

又如,查询语文科目,不同的班级各自的平均分,并查询平均分高于 90 以上的班级:

select class_name,avg(score) from student_exam_info where subject = '语文' group by class_name having avg(score) >= 90;

这里需要注意wherehaving的区别:where执行在分组聚合之前,用于对原始数据进行筛选;而having执行在分组聚合之后,用于对聚合后的结果进行过滤。在 Java 全栈开发中,当我们从数据库获取分组统计数据时,需要根据业务需求合理使用wherehaving,确保获取到准确的数据。

(三)where 与 having 的区别总结

  1. 执行顺序where执行在分组聚合之前,用于对原始数据进行过滤,以减少参与分组聚合的数据量;而having执行在分组聚合之后,用于对聚合后的结果进行筛选。
  2. 适用对象where子句不能使用聚合函数,因为此时聚合操作尚未进行;而having子句主要用于对聚合函数的结果进行条件判断。

在实际的 Java 全栈开发项目中,正确理解和运用wherehaving的区别至关重要。例如,在一个电商订单数据分析系统中,如果要统计每个用户的订单总金额,并筛选出订单总金额大于 1000 元的用户,我们需要使用group by对用户进行分组,使用sum函数计算订单总金额,然后使用having子句筛选出符合条件的用户。而如果要先筛选出特定时间段内的订单数据,再进行分组统计,那么对时间段的筛选就应该使用where子句。

三、企业工作小技巧

  1. 合理使用索引:在进行分组查询时,如果分组字段上有索引,查询性能会得到显著提升。例如,在goods_info表中,如果经常按照good_type进行分组查询,可以考虑在good_type字段上创建索引。但要注意,索引并非越多越好,过多的索引会增加数据插入和更新的时间开销,因为数据库在插入或更新数据时,不仅要更新表数据,还要更新相关的索引。
  2. 避免复杂分组:尽量避免在一个查询中使用过多的分组字段或复杂的分组逻辑,因为这可能会导致查询性能急剧下降。如果业务需求确实复杂,可以考虑将大查询拆分成多个小查询,逐步进行数据处理。例如,在一个涉及多个维度分组统计的报表生成场景中,如果直接进行多维度复合分组查询,可能会因为数据量过大而导致查询超时。此时,可以先按照主要维度进行分组统计,将结果存储在临时表中,然后再对临时表进行二次分组统计,以降低查询复杂度。
  3. 结合 Java 代码优化:在 Java 全栈开发中,不要仅仅依赖数据库进行所有的数据处理。可以在数据库层面进行必要的分组和聚合操作,然后将结果返回给 Java 代码进行进一步的处理和筛选。例如,在统计学生成绩时,数据库查询返回每个学生的总分和平均分,Java 代码可以根据业务规则对这些数据进行进一步的筛选和分析,如计算每个学生的成绩排名等,这样可以减轻数据库的负担,提高系统的整体性能。

通过对 Oracle 数据库分组查询的深入学习和实践,我们掌握了一种强大的数据处理工具。在未来的 Java 全栈开发工作中,灵活运用分组查询能够帮助我们高效地解决各种数据统计和分析问题,为企业提供有价值的数据支持。希望大家不断练习,将这些知识转化为实际的开发能力。

因为篇幅原因后续的联合查询&子查询将在下一篇补充完整

                  Oracle 数据库基础入门(四):分组与联表查询的深度探索(下)-CSDN博客             

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis实现批量添加

1.设计一张商品表 CREATE TABLE IF NOT EXISTS goods (id BIGINT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL );2.编写实体类映射数据库表格 Data public class Goods {private Long id;private String name;// Getters and Setters }3.编写持久层接口以及其对应…

FPGA开发时序图绘制

开始的时候画时序图都是拿 visio 硬连,但是那个线宽太难统一了,丑不拉几的,遂学习 waveform 语法使用代码来画时序图。 开始 Vscode 中安装 waveform render 或者在 GitHub 搜索 wavedrom 安装即可。由于 vscode 是我常用的编辑器&#xff…

【Python爬虫】爬取公共交通路网数据

程序来自于Github,以下这篇博客作为完整的学习记录,也callback上一篇爬取公共交通站点的博文。 Bardbo/get_bus_lines_and_stations_data_from_gaode: 这个项目是基于高德开放平台和公交网获取公交线路及站点数据,并生成shp文件,…

微服务组件详解——sentinel

1.启动sentinel: 下载jar sentinel-dashboard-1.8.0.jar 使用以下命令直接运行 jar 包(JDK 版本必须≥ 1.8): java -Dserver.port9999 -jar D:\sentinel-dashboard-1.8.0.jar 控制台访问地址:http://localhost:9999…

AJAX介绍

XMLHttpRequest get请求使用 const xhr new XMLHttpRequest(); xhr.open("GET", "/data/test.json", true); xhr.onreadystatechange function () {if (xhr.readyState 4) {if (xhr.status 200) {alert(xhr.responseText);} else {console.log("…

Windows下使用docker安装rocketmq

最近准备把rocketmq重新学下,先把环境搭建好 Windows下安装docker拉取最新的rocketmq启动nameserver启动broker 首先在Windows下安装docker,之前不知道为什么,docker desktop启动一直报错,今天把Windows更新了一下,do…

Oracle 11g的部署配置

1、进入官网下载所需版本的Oracle 2、安装 ①:选择setup.exe开始安装 ②:安装提示如下,直接忽略,选是 ③:配置安全更新 填写邮箱,并取消勾选 ④:如果点击下一步,提示什么代理啥的…

【RabbitMQ】RabbitMQ的核心概念与七大工作模式

🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 在现代分布式系统和微服务架构中,消息队列(Message Queue) 是解决服务间通信、系统解耦和流量削峰的关键技术之一。而 RabbitMQ 作为一…

springboot宠物服务系统-计算机毕业设计源码29146

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3 论文结构与章节安排 2 系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体…

使用 CLion 代替 BeyondStudio for NXP 开发 JN 5169

使用 CLion 代替 BeyondStudio for NXP 开发 JN 5169 一、安装 CLion二、搭建 NXP JN5169 ZigBee 3.0 开发环境和下载示例工程三、配置 CLion1、使用 CLion 打开 JN-AN-12192、创建自定义构建目标3、添加构建配置4、在构建前添加外部工具5、添加 6 个运行配置对于 6 个构建选项…

《鸢尾花数学大系:从加减乘除到机器学习》开源资源

《鸢尾花数学大系:从加减乘除到机器学习》开源资源 Gitee:https://gitee.com/higkoo/ bilibili:https://space.bilibili.com/513194466 GitHub:https://github.com/Visualize-ML

操作系统启动——前置知识预备

文章目录 1. 理解冯诺依曼体系结构1.1 简单见一见冯诺依曼1.2 进一步认识1.3 为什么一定要有内存的存在? 2. 操作系统2.1 概念2.2 设计OS的目的2.3 OS的核心功能2.4 如何理解“管理”二字?(小故事版)2.5 系统调用和库函数概念 3. 进程简述3.1 基本概念3.…

PMP项目管理—资源管理篇—5.管理团队

文章目录 基本信息4W1HITTO输入工具与技术输出 冲突管理解决方案八字方针冲突管理策略 基本信息 4W1H what: 跟踪团队成员工作表现,提供反馈,解决问题并管理团队变更,以优化项目绩效的过程。why: 影响团队行为、管理团队冲突,解…

数据结构与算法:选择排序

介绍 选择排序是一种简单直观的排序算法,其基本思想是:从待排序的数据元素中,每次选择最小(或最大)的元素,将其与序列的起始位置交换,然后继续对剩余的元素进行排序,知道整个序列排…

大模型提示词推理架构对比:ReAct/CoT/ToT

人工智能(AI)已不再只是一个流行词——它是驱动现代问题解决的引擎。但AI究竟是如何“思考”的呢?这就涉及到了推理框架。在本文中,我们将探讨三种关键框架:ReAct(推理与行动)、思维链&#xff…

【Linux】冯诺依曼体系结构-操作系统

一.冯诺依曼体系结构 我们所使用的计算机,如笔记本等都是按照冯诺依曼来设计的: 截止目前,我们所知道的计算机都是由一个一个的硬件组装起来的,这些硬件又由于功能的不同被分为了输入设备,输出设备,存储器…

【云原生】Spring Cloud是什么?Spring Cloud版本介绍

什么是SpringCloud 上一章节介绍了总体的SpringCloud的总体学习章节,因为最近项目刚好需要用到SpringCloud来搭建微服务项目、所以就跟着大家一起来再学习巩固下SpringCloud的相关知识 SpringCloud是基于SpringBoot提供了一套微服务解决方案,包括服务注…

人机交互革命:从触屏到脑波的13维战争

人机交互革命:从触屏到脑波的13维战争 一、交互维度大爆炸:重新定义人机沟通边界 当ChatGPT开始解析你的微表情,当Neuralink芯片能读取皮层信号,人机交互已突破【键鼠】的次元壁。我们正经历人类史上最大规模的感官革命&#xff…

高考數學。。。

2024上 具体来说,直线的参数方程可以写为: x1t y−t z1t 二、简答题(本大题共5小题,每小题7分,共35分。) 12.数学学习评价不仅要关注结果评价,也要关注过程评价。简要说明过程评价应关注哪几个方面。…

低空监视-无人机专用ADS-B应答机

产品简介 ping200XR是经过TSO适航认证的无人机专用ADS-B应答机,用于中大型无人机的低空监视。将经过认证的航空级航电设备引入无人机系统。该应答机支持航管二次雷达A,C/S模式和ADS-B OUT。重量仅52克满足无人机所面临的尺寸、重量、功耗的挑战&#xf…