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;
  • 按照商品类型,分别统计不同的商品类型的最低价、平均价、总价:
select
    good_type,
    max(good_price) as maxPrice,
    min(good_price) as minPrice,
    avg(good_price) as avgPrice,
    sum(good_price) as sumPrice
from
    goods_info 
group by
    good_type;

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

(二)复合分组

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

select
    good_type,
    make_address,
    count(*) 
from
    goods_info 
group by
    good_type,
    make_address;

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

  • 按照学生姓名分组,统计不同的学生总分是多少,并按照总分进行降序排列:
select
    name,
    sum( score ) as total 
from
    student_exam_info 
group by
    name 
order by
    total 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 以上的学生:

select
    name,
    sum( score ) as total 
from
    student_exam_info 
group by
    name 
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博客             

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

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

相关文章

Lua | 每日一练 (4)

💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Lua | 每日一练 (4)题目参考答案线程和协程调度方式上…

我代表中国受邀在亚马逊云科技全球云计算大会re:Invent中技术演讲

大家好我是小李哥,本名叫李少奕,目前在一家金融行业公司担任首席云计算工程师。去年5月很荣幸在全球千万名开发者中被选为了全球亚马逊云科技认证技术专家(AWS Hero),是近10年来大陆地区仅有的第9名大陆专家。同时作为…

C++蓝桥杯基础篇(七)

片头 嗨~小伙伴们,大家好!今天我们来一起学习蓝桥杯基础篇(七),学习相关字符串的知识,准备好了吗?咱们开始咯! 一、字符与整数的联系——ASCII码 每个常用字符都对应一个-128~127的…

显式 GC 的使用:留与去,如何选择?

目录 一、什么是显式 GC? (一) 垃圾回收的基本原理 (二)显式 GC 方法和行为 1. System.gc() 方法 2. 显式 GC 的行为 (三)显式 GC 的使用场景与风险 1. JVM 如何处理显式 GC 2. 显式 GC…

2025.03.03(第一天)

1、常见的高危端口号有哪些,并涉及到哪些攻击方式 端口号服务常见攻击方式21FTP匿名登录、文件上传漏洞22SSH暴力破解、密钥泄露、中间人攻击53DNSDNS劫持、DNS缓存投毒、DDoS放大攻击80/443HTTP/HTTPSSQL注入1433MSSQL暴力破解、SQL注入、远程代码执行3306MySQLSQ…

MySQL数据库基本概念

目录 什么是数据库 从软件角度出发 从网络角度出发 MySQL数据库的client端和sever端进程 mysql的client端进程连接sever端进程 mysql配置文件 MySql存储引擎 MySQL的sql语句的分类 数据库 库的操作 创建数据库 不同校验规则对查询的数据的影响 不区分大小写 区…

确保移动设备上机器学习的安全性:挑战与最佳实践

随着企业不断推出更智能、个性化且响应迅速的体验,AI处理能力在移动设备中的普及,促使了机器学习(ML)本地集成的应用和SDK的快速发展。2024年谷歌I/O大会报告中强调了这一趋势,谷歌鼓励开发者在移动应用中使用本地机器…

【Mac】2025-MacOS系统下常用的开发环境配置

早期版本的一个环境搭建参考 1、brew Mac自带终端运行: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" Installation successful!成功后运行三行命令后更新环境(xxx是mac的username&a…

计算机毕业设计SpringBoot+Vue.js美食推荐系统商城(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

【Linux网络#14】:数据链路层(以太网 局域网通信 ARP协议 ARP 欺骗 DDos 攻击)

📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 生活总是不会一帆风顺&#x…

001-码云操作

码云操作 一、配置公钥1.官网地址1.进入 git bash2.查看生成的公钥3.设置到 Gitee4.测试 二、初始化一个项目1.新建仓库 一、配置公钥 方便后续提交代码不用填写密码 1.官网地址 官网地址:https://gitee.com/Git码云教程:https://gitee.com/help/arti…

Android 获取jks的SHA1值:java.io.IOException: Invalid keystore format

命令生成 keytool -list -v -keystore 全路径.jks -alias 别名 -storepass 密码 -keypass 密码 1、遇到 的问题: 通过快捷键 ‘win r’ 启动的小黑框运行上面的命令会出现下面这个错误keytool 错误: java.io.IOException: Invalid keystore format 2、解决问题 …

项目准备(flask+pyhon+MachineLearning)- 1

目录 这是一篇学习笔记 1. 搭建项目 2.前期准备工作 3.创建用户(user)模板 这是一篇学习笔记 目的:用flask快速实现发布有关机器学习的项目,掌握flask框架,机器学习模型的存储和调用。 1. 搭建项目 使用pycharm创建项目,fl…

DeepSeek开源周Day5: 3FS存储系统与AI数据处理新标杆

项目地址: GitHub - deepseek-ai/3FS: A high-performance distributed file system designed to address the challenges of AI training and inference workloads.GitHub - deepseek-ai/smallpond: A lightweight data processing framework built on DuckDB and…

火语言RPA--PDF提取图片

【组件功能】:提取PDF文档指定位置图片 配置预览 配置说明 文件路径 支持T或# 默认FLOW输入项 待提取图片的PDF文件的完整路径。 提取位置 全部、指定页、指定范围3种位置供选择。 PDF文件密码 支持T或# 打开PDF文件的密码。 页码 支持T或# 提取指定页的页…

专业便捷PDF软件,即开即用

PDF文件因其小巧的体积、便捷的分享与存储方式,以及卓越的安全性,已成为学习、企业及各类机构中不可或缺的文件格式。无论是在学术研究、课程资料、商业报告还是合同文件中,PDF都能有效保持原有的格式和布局,确保内容在不同设备和…

LLVM - 编译器前端 - 学习将源文件转换为抽象语法树(二)

一:处理消息 在一个庞大的软件(比如编译器)中,我们不希望将消息字符串分散在各个地方。如果需要修改消息内容或将其翻译成另一种语言,最好将它们集中存放在一个地方!目前缺少的是对消息的集中定义。下面我们看看来如何实现它。 一种简单的方法是,每条消息都有一个 ID(一…

windows安装vue

1、下载nodejs安装包 https://nodejs.cn/download/ 2、安装node 中途记得可以自己改安装路径,其他都是下一步 3、安装完成后检查 node -v :查看nodejs的版本 npm -v :查看npm的版本 4、修改npm默认安装目录与缓存日志目录的位置 在nodejs目…

PyCharm接入本地部署DeepSeek 实现AI编程!【支持windows与linux】

今天尝试在pycharm上接入了本地部署的deepseek,实现了AI编程,体验还是很棒的。下面详细叙述整个安装过程。 本次搭建的框架组合是 DeepSeek-r1:1.5b/7b Pycharm专业版或者社区版 Proxy AI(CodeGPT) 首先了解不同版本的deepsee…

注意力机制详解笔记 Attention is all I donot understand!

注意力机制好奇了太久,QKV知道是什么但是一直没搞懂为什么,这段时间终于眼一闭心一横摁头看了一天视频,3B1B大佬太强了!基于GPT看了三个视频,基本讲的toy model,没有讲“硬核”的如何训练和码代码&#xff…