客户对网站设计的要求,如何做网站策划案,如何进行搜索引擎优化 简答案,如何设置wordpress会员注册页在 Oracle 数据库的学习进程中#xff0c;分组查询与联表查询是进阶阶段的重要知识点#xff0c;它们如同数据库操作的魔法棒#xff0c;能够从复杂的数据中挖掘出有价值的信息。对于 Java 全栈开发者而言#xff0c;掌握这些技能不仅有助于高效地处理数据库数据#xff0…在 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;这里需要注意where和having的区别where执行在分组聚合之前用于对原始数据进行筛选而having执行在分组聚合之后用于对聚合后的结果进行过滤。在 Java 全栈开发中当我们从数据库获取分组统计数据时需要根据业务需求合理使用where和having确保获取到准确的数据。
三where 与 having 的区别总结
执行顺序where执行在分组聚合之前用于对原始数据进行过滤以减少参与分组聚合的数据量而having执行在分组聚合之后用于对聚合后的结果进行筛选。适用对象where子句不能使用聚合函数因为此时聚合操作尚未进行而having子句主要用于对聚合函数的结果进行条件判断。
在实际的 Java 全栈开发项目中正确理解和运用where与having的区别至关重要。例如在一个电商订单数据分析系统中如果要统计每个用户的订单总金额并筛选出订单总金额大于 1000 元的用户我们需要使用group by对用户进行分组使用sum函数计算订单总金额然后使用having子句筛选出符合条件的用户。而如果要先筛选出特定时间段内的订单数据再进行分组统计那么对时间段的筛选就应该使用where子句。 三、企业工作小技巧
合理使用索引在进行分组查询时如果分组字段上有索引查询性能会得到显著提升。例如在goods_info表中如果经常按照good_type进行分组查询可以考虑在good_type字段上创建索引。但要注意索引并非越多越好过多的索引会增加数据插入和更新的时间开销因为数据库在插入或更新数据时不仅要更新表数据还要更新相关的索引。避免复杂分组尽量避免在一个查询中使用过多的分组字段或复杂的分组逻辑因为这可能会导致查询性能急剧下降。如果业务需求确实复杂可以考虑将大查询拆分成多个小查询逐步进行数据处理。例如在一个涉及多个维度分组统计的报表生成场景中如果直接进行多维度复合分组查询可能会因为数据量过大而导致查询超时。此时可以先按照主要维度进行分组统计将结果存储在临时表中然后再对临时表进行二次分组统计以降低查询复杂度。结合 Java 代码优化在 Java 全栈开发中不要仅仅依赖数据库进行所有的数据处理。可以在数据库层面进行必要的分组和聚合操作然后将结果返回给 Java 代码进行进一步的处理和筛选。例如在统计学生成绩时数据库查询返回每个学生的总分和平均分Java 代码可以根据业务规则对这些数据进行进一步的筛选和分析如计算每个学生的成绩排名等这样可以减轻数据库的负担提高系统的整体性能。
通过对 Oracle 数据库分组查询的深入学习和实践我们掌握了一种强大的数据处理工具。在未来的 Java 全栈开发工作中灵活运用分组查询能够帮助我们高效地解决各种数据统计和分析问题为企业提供有价值的数据支持。希望大家不断练习将这些知识转化为实际的开发能力。 因为篇幅原因后续的联合查询子查询将在下一篇补充完整 Oracle 数据库基础入门四分组与联表查询的深度探索下-CSDN博客