数据库实验:分组查询与聚集函数的使用

news2025/4/16 7:19:37

目录

  • 引言
    • 一、`GROUP BY`核心规则与常见错误
    • 二、高级分组选项:`ROLLUP`、`CUBE`与`GROUPING SETS`
    • 三、窗口函数:在原始行中显示分组聚合结果
    • 四、`UNION ALL`合并结果集:解决冗余查询问题
    • 五、实验体会
  • 结语 (附上实验中表格的信息)
    • STUDENT057
    • COURSE057
    • TEACHER057
    • SCORE057

引言

在数据库原理实验中,掌握数据分组查询(GROUP BY)和聚集函数(如AVGMAX)的使用是核心目标。本次实验以“学生选课成绩”数据为例,深入实践了分组统计、高级分组选项(ROLLUP/CUBE)、窗口函数等关键技术,同时解决了多个典型问题。本文结合实验中的踩坑经历与收获,总结出一套实用的查询技巧。

一、GROUP BY核心规则与常见错误

1. 基础分组:非聚合列必须出现在GROUP BY
问题场景
执行以下语句时报错:

SELECT SNO, CNO, AVG(DEGREE) 
FROM SCORE057 
GROUP BY SNO;

错误信息: 如图所示

在这里插入图片描述

原因分析
GROUP BY要求所有非聚合列(如CNO)必须出现在分组字段中,否则数据库无法确定如何对这些列进行分组。

正确做法
将分组字段补充完整:

SELECT SNO, CNO, AVG(DEGREE) 
FROM SCORE057 
GROUP BY SNO, CNO; -- 按学号和课程号分组

2. 分组后的筛选:HAVINGWHERE的区别
核心规则

  • WHERE:在分组前过滤数据(针对原始行)。
  • HAVING:在分组后过滤数据(针对分组结果)。

示例
查询平均成绩≥80分的学生学号:

SELECT S.SNO,S.SNAME, AVG(DEGREE) AS 平均分 
FROM SCORE057 SC
JOIN student057 S ON SC.Sno= S.Sno
GROUP BY S.SNO,S.SNAME
HAVING AVG(DEGREE) >= 80; -- 对分组后的平均分进行筛选

查询结果如下图所示:
在这里插入图片描述

二、高级分组选项:ROLLUPCUBEGROUPING SETS

1. ROLLUP:层级汇总(从右到左)
作用:生成多级汇总行,用于快速计算“分组+总计”。
示例

SELECT SNO, CNO, AVG(DEGREE)平均 
FROM SCORE057 
GROUP BY SNO, CNO WITH ROLLUP;

结果
在这里插入图片描述

结果特点

  • 先按(SNO, CNO)分组,再按SNO汇总(CNONULL),最后生成全表汇总(SNOCNO均为NULL)。
  • 适用于生成“部门→小组→总计”类层级报表。

2. CUBE:全组合汇总
作用:生成所有可能的分组组合(包括单个字段、交叉组合、全汇总)。
示例

SELECT SNO, CNO, AVG(DEGREE) 平均
FROM SCORE057 
GROUP BY CUBE(SNO, CNO);

结果
在这里插入图片描述

结果特点

  • 包含(SNO, CNO)SNO单独分组、CNO单独分组、全汇总(NULL, NULL)等所有组合。
  • 适用于多维数据分析(如按学生、课程、全局的成绩汇总)。

3. GROUPING SETS:自定义分组组合
作用:按需指定分组方式,避免生成冗余的汇总行。
示例

SELECT SNO, CNO, AVG(DEGREE) 平均分
FROM SCORE057 
GROUP BY GROUPING SETS (SNO, CNO); -- 仅按SNO和按CNO分组

结果
在这里插入图片描述

结果特点

  • 生成SNO单独分组和CNO单独分组的结果,无交叉汇总。
  • 灵活控制分组粒度,提升查询效率。

三、窗口函数:在原始行中显示分组聚合结果

场景需求
查询学生的“学号、课程号、成绩”,并在每行显示该学生的平均分(按学号分区)和该课程的平均分(按课程号分区)。

解决方案:AVG() OVER (PARTITION BY ...)

SELECT 
  S.SNO 学号, 
  S.SNAME 姓名, 
  C.CNO 课程号, 
  C.CNAME 课程名, 
  SC.DEGREE 成绩,
  AVG(SC.DEGREE) OVER (PARTITION BY S.SNO) AS 学生平均分, -- 按学号分区
  AVG(SC.DEGREE) OVER (PARTITION BY C.CNO) AS 课程平均分 -- 按课程号分区
FROM STUDENT057 S
JOIN SCORE057 SC ON S.SNO = SC.SNO
JOIN COURSE057 C ON SC.CNO = C.CNO;

查询结果
在这里插入图片描述

四、UNION ALL合并结果集:解决冗余查询问题

场景需求
分别查询“每门课程的平均分”和“每位学生的平均分”,并将结果合并为一个报表,避免重复列。 如果按照上题所示的查询方法进行查询会发现查询结果过度冗余,影响表格的阅读。

解决方案:分两次查询后合并

SELECT  '平' AS 学号, '均 ' AS 姓名, c.CNO AS 课程号, c.CNAME AS 课程名, AVG(sc.DEGREE) AS 平均
FROM  SCORE057 sc
JOIN COURSE057 c ON sc.CNO = c.CNO
GROUP BY  c.CNO, c.CNAME
UNION ALL
SELECT  s.SNO AS 学号,s.SNAME AS 姓名, '平' AS 课程号,'均' AS 课程名, AVG(sc2.DEGREE) AS 平均
FROM STUDENT057 s
JOIN SCORE057 sc2 ON s.SNO = sc2.SNO
GROUP BY  s.SNO, s.SNAME;

在这里插入图片描述

五、实验体会

1. 数据逻辑的严谨性

  • GROUP BY报错是因为忽略了“非聚合列必须分组”的规则,这提醒我们写查询时需明确“分组依据”与“显示列”的一致性。
  • 高级分组选项(ROLLUP/CUBE)的结果差异,本质是对“汇总维度”的不同抽象,需结合业务场景选择。

2. 工具与文档的重要性

  • 窗口函数的语法复杂,通过查阅SQL Server文档和调试示例,才理解OVER子句的分区与排序逻辑。
  • 报错信息是最好的老师,例如“列无效”错误直接指向GROUP BY的规则,按提示修正即可。

3. 复杂查询的拆解思路

  • 将“显示学生和课程平均分”的需求拆解为“原始数据→分区聚合→结果合并”,逐步实现避免逻辑混乱。
  • 善用JOIN关联多张表(学生、课程、成绩),确保数据完整性。

结语 (附上实验中表格的信息)

通过本次实验,不仅掌握了GROUP BY、聚集函数、窗口函数等核心查询技术,更重要的是学会了如何通过调试和分析解决实际问题。此次实验中的表格如下图所示:

STUDENT057

在这里插入图片描述

COURSE057

在这里插入图片描述

TEACHER057

在这里插入图片描述

SCORE057

在这里插入图片描述

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

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

相关文章

Open-TeleVision源码解析——宇树摇操方案的重要参考:VR控制人形机器人采集数据

前言 本来针对Open-TeleVision的源码解析,是打算放在此文《从宇树摇操avp_teleoperate到unitree_IL_lerobot:如何基于宇树人形进行二次开发》中的,但考虑到为避免篇幅过长,故独立成此文 第一部分 Open-TeleVision的源码解析 如本…

推流265视频,网页如何支持显示265的webrtc

科技发展真快,以前在网页上(一般指谷歌浏览器),要显示265的视频流,都是很鸡肋的办法,要么转码,要么用很慢的hls,体验非常不好,而今谷歌官方最新的浏览器已经支持265的web…

“破解”GPT-4o生图技术:万物皆可吉卜力的技术路线推测

👉目录 1 GPT-4o 的神奇魔法 2 GPT-4o 可能的技术路线推测 3 结语 最近 GPT-4o 生图模型横空出世,效果和玩法上都有突破性的进展,笔者整理了一下目前相关的技术,抛砖引玉一下,希望有更多大神分享讨论。 图源小红书恶魔…

基于SpringBoot的电影订票系统(源码+数据库+万字文档+ppt)

504基于SpringBoot的电影订票系统,系统包含两种角色:管理员、用户主要功能如下。 【用户功能】 首页:浏览系统电影动态。 资讯信息:获取有关电影行业的新闻和资讯。 电影信息:查看电影的详细信息和排片情况。 公告信…

07-算法打卡-链表-移除链表-leetcode(203)-第七天

1 题目地址 203. 移除链表元素 - 力扣(LeetCode)203. 移除链表元素 - 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1:[https://assets.leetc…

在线地图支持天地图和腾讯地图,仪表板和数据大屏支持发布功能,DataEase开源BI工具v2.10.7 LTS版本发布

2025年4月11日,人人可用的开源BI工具DataEase正式发布v2.10.7 LTS版本。 这一版本的功能变动包括:数据源方面,Oracle数据源支持获取和查询物化视图;图表方面,在线地图支持天地图、腾讯地图;新增子弹图&…

粉末冶金齿轮学习笔记分享

有一段小段时间没有更新了,不知道小伙们有没有忘记我。最近总听到粉末冶金齿轮这个概念,花点时间来学习一下,总结一篇笔记分享给大家。废话不多说,直接开始: “粉末冶金”是一种制造工艺,包括在高压下压实…

Retina:部署在神经硬件的SNN眼动追踪算法

论文链接:Retina : Low-Power Eye Tracking with Event Camera and Spiking Hardware 这是一篇发表在2024CVPRW上的文章,做了三个contribution: 将SNN放在Eye Tracking任务上。提出了Ini-30数据集部署到了Spike硬件上 还是挺有趣的。但是由于…

OCR API识别对比

OCR 识别DEMO OCR识别 demo 文档由来 最开始想使用百度开源的 paddlepaddle大模型 研究了几天,发现表格识别会跨行,手写识别的也不很准确。最终还是得使用现成提供的api。。 文档说明 三个体验下来 腾讯的识别度比较高,不论是手写还是识别表…

flutter 桌面应用之右键菜单

​在 Flutter 桌面应用开发中,context_menu 和 contextual_menu 是两款常用的右键菜单插件,各有特色。以下是对它们的对比分析:​ context_menu 集成方式:​通过 ContextMenuArea 组件包裹目标组件,定义菜单项。​掘金…

Cygwin编译安装Acise

本文记录Windows下使用Cygwin编译安装Acise的流程。 零、环境 操作系统Windows11Visual Studio CodeVisual Studio Code 1.92.0Cygwin 一、工具及依赖 1.1 Visual Studio Code 下载并安装Visual Studio Code, 同时安装以下插件, Task Explorer Output Colorizer …

pyqtgraph.opengl.items.GLSurfacePlotItem.GLSurfacePlotItem 报了一个错

1. 需求是这个样子的 有一个 pyqtgraph.opengl.GLViewWidget ,在应用启动时存在QMainWindow中,即父对象是QMainWindow,当业务需要时,修改它的父对象变为一个QDialog,可以让它从QMainWindow中弹出显示在QDialog里&#…

【C++初学】课后作业汇总复习(六) 函数模板

1、函数模板 思考:如果重载的函数,其解决问题的逻辑是一致的、函数体语句相同,只是处理的数据类型不同,那么写多个相同的函数体,是重复劳动,而且还可能因为代码的冗余造成不一致性。 解决:使用…

【第16届蓝桥杯C++C组】--- 数位倍数

Hello呀,小伙伴们,第16届蓝桥杯也完美结束了,无论大家考的如何,都要放平心态,今年我刚上大一,也第一次参加蓝桥杯,刷的算法题也只有200来道,但是还是考的不咋滴,但是拿不…

Numpy和OpenCV库匹配查询,安装OpenCV ABI错误

文章目录 地址opencv-python:4.x版本的对应numpyopencv-python:5.x版本的对应numpy方法2 ps:装个opencv遇到ABI错误无语了,翻了官网,github文档啥都没,记录下 地址 opencv-python:4.x版本的对应…

ubuntu18.04安装miniforge3

1.下载安装文件 略(注:从同事哪里拖来的安装包) 2.修改安装文件权限 chmod x Miniforge3-Linux-x86_64.sh 3.将它安装到指定位置 micromamba activate /home/xxx/fxp/fromDukto/miniforge3 4.激活 /home/xxx/fxp/fromDukto/miniforge3…

智能手机功耗测试

随着智能手机发展,用户体验对手机的续航功耗要求越来越高。需要对手机进行功耗测试及分解优化,将手机的性能与功耗平衡。低功耗技术推动了手机的用户体验。手机功耗测试可以采用powermonitor或者NI仪表在功耗版上进行测试与优化。作为一个多功能的智能终端,手机的功耗组成极…

使用U盘安装 ubuntu 系统

1. 准备U 盘制作镜像 1.1 下载 ubuntu iso https://ubuntu.com/download/ 这里有多个版本以供下载,本文选择桌面版。 1.2 下载rufus https://rufus.ie/downloads/ 1.3 以管理员身份运行 rufus 设备选择你用来制作启动项的U盘,不能选错了;点…

oracle 并行度(Parallel Degree)

在Oracle数据库中,并行度(Parallel Degree) 是用于控制并行处理任务的关键配置,旨在通过多进程协作加速大规模数据处 一、并行度的核心概念 并行度(DOP, Degree of Parallelism) 表示一个操作同时使用的并…

Redis-场景缓存+秒杀+管道+消息队列

缓存一致性 1.两次更新 先更新数据库,再更新缓存;先更新缓存,再更新数据库; 出现不一致问题场景: 先更新数据库,再更新缓存; 先更新缓存,再更新数据库; 两次更新的适…