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

news2025/3/4 7:33:18

在 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博客             

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习的起点:线性回归Linear Regression

机器学习的起点:线性回归Linear Regression 作为机器学习的起点,线性回归是理解算法逻辑的绝佳入口。我们从定义、评估方法、应用场景到局限性,用生活化的案例和数学直觉为你构建知识框架。 回归算法 一、线性回归的定义与核心原理 定义&a…

17、什么是智能指针,C++有哪几种智能指针【高频】

智能指针其实不是指针,而是一个(模板)类,用来存储指向某块资源的指针,并自动释放这块资源,从而解决内存泄漏问题。主要有以下四种: auto_ptr 它的思想就是当当一个指针对象赋值给另一个指针对…

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

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

PyCharm怎么集成DeepSeek

PyCharm怎么集成DeepSeek 在PyCharm中集成DeepSeek等大语言模型(LLM)可以借助一些插件或通过代码调用API的方式实现,以下为你详细介绍两种方法: 方法一:使用JetBrains AI插件(若支持DeepSeek) JetBrains推出了AI插件来集成大语言模型,不过截至2024年7月,官方插件主要…

【定昌Linux系统】部署了java程序,设置开启启动

将代码上传到相应的目录,并且配置了一个.sh的启动脚本文件 文件内容: #!/bin/bash# 指定JAR文件的路径(如果JAR文件在当前目录,可以直接使用文件名) JAR_FILE"/usr/local/java/xs_luruan_client/lib/xs_luruan_…

Java零基础入门笔记:(7)异常

前言 本笔记是学习狂神的java教程,建议配合视频,学习体验更佳。 【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩_bilibili 第1-2章:Java零基础入门笔记:(1-2)入门(简介、基础知识)-CSDN博客 第3章…

【字符串】最长公共前缀 最长回文子串

文章目录 14. 最长公共前缀解题思路:模拟5. 最长回文子串解题思路一:动态规划解题思路二:中心扩散法 14. 最长公共前缀 14. 最长公共前缀 ​ 编写一个函数来查找字符串数组中的最长公共前缀。 ​ 如果不存在公共前缀,返回空字符…

react 中,使用antd layout布局中的sider 做sider的展开和收起功能

一 话不多说,先展示效果: 展开时: 收起时: 二、实现代码如下 react 文件 import React, {useState} from react; import {Layout} from antd; import styles from "./index.module.less"; // 这个是样式文件&#…

easyExcel使用案例有代码

easyExcel 入门,完成web的excel文件创建和导出 easyExcel官网 EasyExcel 的主要特点如下: 1、高性能:EasyExcel 采用了异步导入导出的方式,并且底层使用 NIO 技术实现,使得其在导入导出大数据量时的性能非常高效。 2、易于使…

苹果廉价机型 iPhone 16e 影像系统深度解析

【人像拍摄差异】 尽管iPhone 16e支持后期焦点调整功能,但用户无法像iPhone 16系列那样通过点击屏幕实时切换拍摄主体。前置摄像头同样缺失人像深度控制功能,不过TrueTone原彩闪光灯系统在前后摄均有保留。 很多人都高估了 iPhone 的安全性,查…

视觉图像坐标转换

1. 透镜成像 相机的镜头系统将三维场景中的光线聚焦到一个平面(即传感器)。这个过程可以用小孔成像模型来近似描述,尽管实际相机使用复杂的透镜系统来减少畸变和提高成像质量。 小孔成像模型: 假设有一个理想的小孔,…

脚本无法获取响应主体(原因:CORS Missing Allow Credentials)

背景: 前端的端口号8080,后端8000。需在前端向后端传一个参数,让后端访问数据库去检测此参数是否出现过。涉及跨域请求,一直有这个bug是404文件找不到。 在修改过程当中不小心删除了一段代码,出现了这个bug&#xff0…

leetcode第39题组合总和

原题出于leetcode第39题https://leetcode.cn/problems/combination-sum/description/题目如下: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以…

SQLark 数据迁移|断点续迁已上线(Oracle-达梦)

数据迁移是 SQLark 最受企业和个人用户欢迎的功能之一,截止目前已帮助政府、金融、能源、通信等 50 家单位完成从 Oracle、MySQL 到达梦的全量迁移,自动化迁移成功率达 96% 以上。 在 Oracle 到达梦数据库迁移过程中,SQLark V3.3 新增 断点续…

Element Plus中el-tree点击的节点字体变色加粗

el-tree标签设置 <el-tree class"tree":data"treeData":default-expand-all"true":highlight-current"true"node-click"onTreeNodeClick"><!-- 自定义节点内容&#xff0c;点击的节点字体变色加粗 --><!-- 动…

vmware安装firepower ftd和fmc

在vmware虚拟机中安装cisco firepower下一代防火墙firepower threat defence&#xff08;ftd&#xff09;和管理中心firepower management center&#xff08;fmc&#xff09;。 由于没有cisco官网下载账号&#xff0c;无法下载其中镜像。使用eveng模拟器中的ftd和fmc虚拟镜像…

计算机毕业设计SpringBoot+Vue.js医院资源管理系统(源码+文档+PPT+讲解)

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

[含文档+PPT+源码等]精品基于Python实现的微信小程序的乡村医疗咨询系统

基于Python实现的微信小程序的乡村医疗咨询系统背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、社会背景 医疗资源分布不均&#xff1a;在我国&#xff0c;城乡医疗资源分布不均是一个长期存在的问题。乡村地区由于地理位置偏远、经济条件有限&#xff0c;往往…

Python实现GO鹅优化算法优化BP神经网络回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 传统BP神经网络的局限性&#xff1a;BP&#xff08;Back Propagation&#xff09;神经网络作为一种…

7.1.2 计算机网络的分类

文章目录 分布范围交换方式 分布范围 计算机网络按照分布范围可分为局域网、广域网、城域网。局域网的范围在10m~1km&#xff0c;例如校园网&#xff0c;网速高&#xff0c;主要用于共享网络资源&#xff0c;拓扑结构简单&#xff0c;约束少。广域网的范围在100km&#xff0c;例…