数据库实验:分组查询与聚集函数的使用
目录
- 引言
- 一、`GROUP BY`核心规则与常见错误
- 二、高级分组选项:`ROLLUP`、`CUBE`与`GROUPING SETS`
- 三、窗口函数:在原始行中显示分组聚合结果
- 四、`UNION ALL`合并结果集:解决冗余查询问题
- 五、实验体会
- 结语 (附上实验中表格的信息)
- STUDENT057
- COURSE057
- TEACHER057
- SCORE057
引言
在数据库原理实验中,掌握数据分组查询(GROUP BY)和聚集函数(如AVG、MAX)的使用是核心目标。本次实验以“学生选课成绩”数据为例,深入实践了分组统计、高级分组选项(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. 分组后的筛选:HAVING与WHERE的区别
核心规则:
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; -- 对分组后的平均分进行筛选
查询结果如下图所示:

二、高级分组选项:ROLLUP、CUBE与GROUPING SETS
1. ROLLUP:层级汇总(从右到左)
作用:生成多级汇总行,用于快速计算“分组+总计”。
示例:
SELECT SNO, CNO, AVG(DEGREE)平均
FROM SCORE057
GROUP BY SNO, CNO WITH ROLLUP;
结果:

结果特点:
- 先按
(SNO, CNO)分组,再按SNO汇总(CNO为NULL),最后生成全表汇总(SNO和CNO均为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

相关文章:
数据库实验:分组查询与聚集函数的使用
目录 引言一、GROUP BY核心规则与常见错误二、高级分组选项:ROLLUP、CUBE与GROUPING SETS三、窗口函数:在原始行中显示分组聚合结果四、UNION ALL合并结果集:解决冗余查询问题五、实验体会 结语 (附上实验中表格的信息)…...
【mllm】——x64模拟htp的后端无法编译debug
mllm, qnn, x64 code:https://github.com/UbiquitousLearning/mllm 1. 问题 通过自定义qualcomm graph使用高通的htp后端进行llm推理,网络暂时只有mllm,和https://github.com/chraac/llama.cpp。qualcomm是支持x64模拟htp推理的,这样比较好d…...
计算机网络- UDP协议详解
UDP协议详解 5. UDP协议详解5.1 UDP协议基础5.1.1 UDP的基本概念5.1.2 UDP报文结构5.1.3 UDP校验和计算5.1.4 UDP在Linux内核中的实现UDP套接字的创建UDP数据的发送UDP数据的接收UDP校验和的计算 5.1.5 UDP的实际应用音视频流媒体在线游戏DNS查询VoIP通信网络时间同步 5.2 UDP编…...
Open-TeleVision源码解析——宇树摇操方案的重要参考:VR控制人形机器人采集数据
前言 本来针对Open-TeleVision的源码解析,是打算放在此文《从宇树摇操avp_teleoperate到unitree_IL_lerobot:如何基于宇树人形进行二次开发》中的,但考虑到为避免篇幅过长,故独立成此文 第一部分 Open-TeleVision的源码解析 如本…...
Embedding质量评估、空间塌缩、 Alignment Uniformity
Embedding质量的评估和空间塌缩的解决是自然语言处理(NLP)和推荐系统领域的关键问题。以下是综合多篇研究的总结: 一、Embedding质量评估方法 基准测试与任务指标 MTEB/C-MTEB:使用多语言或中文的基准测试集(如58个数据…...
[题解] Educational Codeforces Round 168 (Rated for Div. 2) E - level up
链接 思路 1 注意到在 k ∈ [ 1 , n ] k \in [1,n] k∈[1,n] 可以得到的最高等级分别为: n , n 2 , n 3 . . . . . n n n,\frac{n}{2},\frac{n}{3}.....\frac{n}{n} n,2n,3n.....nn, 总的个数是一个调和级数, s u m n ∗ ln n sumn*\ln n sumn∗lnn, 完全可以处…...
Lua 中的 table 类型详解
Lua 中的 table 类型详解 table 是 Lua 中唯一的数据结构机制,它实现了关联数组的功能,可以用来表示普通数组、序列、符号表、集合、记录、图、树等几乎所有数据结构。 基本特性 table 是 Lua 中唯一的数据结构类型可以包含任意类型的值(n…...
github进阶使用教程
目录索引 一、基本内容 repository fork star codespaces issue 在一个仓库创建话题讨论,可以由仓库主人选择开始和结束话题的讨论 pull request(也称 pr) 协同其他仓库开发,请求仓库主人拉取自己的代码合并到仓库的主分支&…...
推流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…...
[C++面试] 初始化相关面试点深究
一、入门 1、C中基础类型的初始化方式有哪些?请举例说明 默认初始化 对于全局变量和静态变量,基础类型(如int、float、double等)会被初始化为 0;而对于局部变量,其值是未定义的,包含随机…...
在线地图支持天地图和腾讯地图,仪表板和数据大屏支持发布功能,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。。 文档说明 三个体验下来 腾讯的识别度比较高,不论是手写还是识别表…...
nodejs构建项目
从零到一搭建 Node.js 框架 搭建一个 Node.js 框架是理解 Web 应用架构的绝佳方式。本指南将带您完成创建一个轻量级但功能完善的 Node.js 框架的全过程,类似于 Express 或 Koa,但规模更小,便于理解。 目录 项目初始化创建核心应用类路由系…...
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 …...
基于STM32、HAL库的IP6525S快充协议芯片简介及驱动程序设计
一、简介: IP6525S是一款高性能的同步降压DC-DC转换器芯片,具有以下特点: 输入电压范围:4.5V至32V 输出电压范围:0.8V至30V 最大输出电流:5A 效率高达95% 可编程开关频率(100kHz-1MHz) 支持PWM和PFM模式 内置过流保护、过温保护等功能 该芯片常用于工业控制、通信设备…...
RabbitMQ惰性队列的工作原理、消息持久化机制、同步刷盘的概念、延迟插件的使用方法
惰性队列工作原理 惰性队列通过尽可能多地将消息存储到磁盘上来减少内存的使用。与传统队列相比,惰性队列不会主动将消息加载到内存中,而是尽量让消息停留在磁盘上,从而降低内存占用。尽管如此,它并不保证所有操作都是同步写入磁…...
MySQL与Oracle深度对比
MySQL与Oracle深度对比:数据类型与SQL差异 一、数据类型差异 1. 数值类型对比 数据类型MySQLOracle整数TINYINT, SMALLINT, MEDIUMINT, INT, BIGINTNUMBER(精度) 或直接INT(内部仍为NUMBER)小数DECIMAL(p,s), FLOAT, DOUBLENUMBER(p,s), FLOAT, BINARY_FLOAT, BI…...
【Leetcode 每日一题】1922. 统计好数字的数目
问题背景 我们称一个数字字符串是 好数字 当它满足(下标从 0 0 0 开始)偶数 下标处的数字为 偶数 且 奇数 下标处的数字为 质数 ( 2 , 3 , 5 (2, \ 3, \ 5 (2, 3, 5 或 7 ) 7) 7)。 比方说,“2582” 是好数字,因为偶数下标处…...
pyqtgraph.opengl.items.GLSurfacePlotItem.GLSurfacePlotItem 报了一个错
1. 需求是这个样子的 有一个 pyqtgraph.opengl.GLViewWidget ,在应用启动时存在QMainWindow中,即父对象是QMainWindow,当业务需要时,修改它的父对象变为一个QDialog,可以让它从QMainWindow中弹出显示在QDialog里&#…...
【C++初学】课后作业汇总复习(六) 函数模板
1、函数模板 思考:如果重载的函数,其解决问题的逻辑是一致的、函数体语句相同,只是处理的数据类型不同,那么写多个相同的函数体,是重复劳动,而且还可能因为代码的冗余造成不一致性。 解决:使用…...
【第16届蓝桥杯C++C组】--- 数位倍数
Hello呀,小伙伴们,第16届蓝桥杯也完美结束了,无论大家考的如何,都要放平心态,今年我刚上大一,也第一次参加蓝桥杯,刷的算法题也只有200来道,但是还是考的不咋滴,但是拿不…...
ASP.NET Core 性能优化:客户端响应缓存
文章目录 前言一、什么是缓存二、客户端缓存核心机制:HTTP缓存头1)使用[ResponseCache]属性(推荐)2)预定义缓存配置(CacheProfile)3)手动设置HTTP头4)缓存验证机制&#…...
Numpy和OpenCV库匹配查询,安装OpenCV ABI错误
文章目录 地址opencv-python:4.x版本的对应numpyopencv-python:5.x版本的对应numpy方法2 ps:装个opencv遇到ABI错误无语了,翻了官网,github文档啥都没,记录下 地址 opencv-python:4.x版本的对应…...
全球变暖(蓝桥杯 2018 年第九届省赛)
题目描述 你有一张某海域 NN 像素的照片,. 表示海洋、 # 表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. .......其中 "上下左右" 四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。 由…...
