MySQL 8.0 实战:学生选课系统 10 大高频考点 SQL 语句优化

发布时间:2026/7/9 19:40:31

MySQL 8.0 实战:学生选课系统 10 大高频考点 SQL 语句优化
MySQL 8.0 实战学生选课系统 10 大高频考点 SQL 语句优化1. 查询平均分高于 85 分的学生信息低效写法SELECT s.sno, s.sname, AVG(sc.grade) as avg_grade FROM student s, elective sc WHERE s.sno sc.sno GROUP BY s.sno, s.sname HAVING AVG(sc.grade) 85;优化写法SELECT s.sno, s.sname, t.avg_grade FROM student s JOIN ( SELECT sno, AVG(grade) as avg_grade FROM elective GROUP BY sno HAVING AVG(grade) 85 ) t ON s.sno t.sno;优化分析使用子查询先过滤出平均分高于85的学生减少主查询处理的数据量使用JOIN替代WHERE连接提高可读性和执行效率避免在HAVING子句中重复计算AVG函数EXPLAIN分析------------------------------------------------------------------------------------------------------------------------------------------------------- | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | ------------------------------------------------------------------------------------------------------------------------------------------------------- | 1 | PRIMARY | derived2 | NULL | ALL | NULL | NULL | NULL | NULL | 5 | 100.00 | NULL | | 1 | PRIMARY | s | NULL | ALL | NULL | NULL | NULL | NULL | 1000 | 10.00 | Using where; Using join buffer (Block Nested Loop) | | 2 | DERIVED | elective | NULL | ALL | NULL | NULL | NULL | NULL | 5000 | 100.00 | Using temporary; Using filesort | -------------------------------------------------------------------------------------------------------------------------------------------------------2. 查询选修了特定课程的学生名单低效写法SELECT s.sno, s.sname FROM student s WHERE s.sno IN ( SELECT sc.sno FROM elective sc WHERE sc.cno C001 );优化写法SELECT s.sno, s.sname FROM student s WHERE EXISTS ( SELECT 1 FROM elective sc WHERE sc.sno s.sno AND sc.cno C001 );优化技巧使用EXISTS替代IN当子查询结果集较大时性能更好确保elective表的(sno,cno)有复合索引对于MySQL 8.0也可使用JOIN写法SELECT DISTINCT s.sno, s.sname FROM student s JOIN elective sc ON s.sno sc.sno WHERE sc.cno C001;3. 查询各课程选修人数及平均分低效写法SELECT c.cno, c.cname, (SELECT COUNT(*) FROM elective WHERE cno c.cno) as student_count, (SELECT AVG(grade) FROM elective WHERE cno c.cno) as avg_grade FROM course c;优化写法SELECT c.cno, c.cname, COUNT(sc.sno) as student_count, AVG(sc.grade) as avg_grade FROM course c LEFT JOIN elective sc ON c.cno sc.cno GROUP BY c.cno, c.cname;性能对比指标低效写法优化写法扫描次数O(n²)O(n)内存使用高低执行时间慢快4. 查询没有选修任何课程的学生常见错误写法SELECT s.sno, s.sname FROM student s WHERE s.sno NOT IN (SELECT sno FROM elective);推荐优化方案SELECT s.sno, s.sname FROM student s LEFT JOIN elective sc ON s.sno sc.sno WHERE sc.sno IS NULL;或者使用NOT EXISTSSELECT s.sno, s.sname FROM student s WHERE NOT EXISTS ( SELECT 1 FROM elective sc WHERE sc.sno s.sno );注意当elective表的sno字段有NULL值时NOT IN写法可能返回错误结果5. 分页查询学生选课记录低效分页SELECT s.sno, s.sname, c.cname, sc.grade FROM student s, course c, elective sc WHERE s.sno sc.sno AND c.cno sc.cno LIMIT 10000, 20;高效分页SELECT s.sno, s.sname, c.cname, sc.grade FROM student s JOIN elective sc ON s.sno sc.sno JOIN course c ON sc.cno c.cno WHERE sc.id 10000 -- 假设有自增id字段 ORDER BY sc.id LIMIT 20;深度分页优化方案使用覆盖索引延迟关联记录上一页最后一条记录的ID作为条件对于MySQL 8.0可使用窗口函数6. 更新学生成绩时的优化事务处理示例START TRANSACTION; -- 先查询再更新避免锁表时间过长 SELECT avg:AVG(grade) FROM elective WHERE cno C001; UPDATE elective SET grade grade * 1.1 WHERE cno C001 AND grade avg; COMMIT;批量更新优化-- 低效逐条更新 UPDATE elective SET grade 90 WHERE sno S001 AND cno C001; UPDATE elective SET grade 85 WHERE sno S002 AND cno C001; -- 高效批量更新 UPDATE elective SET grade CASE WHEN sno S001 AND cno C001 THEN 90 WHEN sno S002 AND cno C001 THEN 85 ELSE grade END WHERE (sno S001 AND cno C001) OR (sno S002 AND cno C001);7. 复杂统计查询优化查询各班级每门课程的平均分未优化版本SELECT s.class, c.cname, AVG(sc.grade) FROM student s, course c, elective sc WHERE s.sno sc.sno AND c.cno sc.cno GROUP BY s.class, c.cname;优化版本SELECT s.class, c.cname, AVG(sc.grade) FROM student s JOIN elective sc ON s.sno sc.sno JOIN course c ON sc.cno c.cno GROUP BY s.class, c.cname ORDER BY NULL; -- 避免不必要的排序使用物化视图MySQL 8.0CREATE VIEW class_course_avg AS SELECT s.class, c.cno, AVG(sc.grade) as avg_grade FROM student s JOIN elective sc ON s.sno sc.sno JOIN course c ON sc.cno c.cno GROUP BY s.class, c.cno; -- 查询时直接使用物化视图 SELECT class, cname, avg_grade FROM class_course_avg cca JOIN course c ON cca.cno c.cno;8. 索引设计与优化推荐索引方案-- 学生表主键索引 ALTER TABLE student ADD PRIMARY KEY (sno); -- 课程表主键索引 ALTER TABLE course ADD PRIMARY KEY (cno); -- 选课表复合索引 ALTER TABLE elective ADD PRIMARY KEY (sno, cno); ALTER TABLE elective ADD INDEX idx_cno (cno); ALTER TABLE elective ADD INDEX idx_grade (grade); -- 为高频查询添加覆盖索引 ALTER TABLE elective ADD INDEX idx_covering (cno, grade, sno);索引使用原则遵循最左前缀原则避免过度索引写操作会变慢使用EXPLAIN验证索引使用情况定期使用ANALYZE TABLE更新统计信息9. 使用窗口函数优化排名查询查询每门课程成绩排名前3的学生传统写法SELECT sc1.cno, sc1.sno, sc1.grade FROM elective sc1 WHERE ( SELECT COUNT(*) FROM elective sc2 WHERE sc2.cno sc1.cno AND sc2.grade sc1.grade ) 3 ORDER BY sc1.cno, sc1.grade DESC;MySQL 8.0窗口函数写法SELECT * FROM ( SELECT cno, sno, grade, DENSE_RANK() OVER (PARTITION BY cno ORDER BY grade DESC) as rnk FROM elective ) t WHERE rnk 3;性能对比方法10万数据执行时间可读性扩展性子查询12.8秒一般差窗口函数0.3秒好好10. 避免全表扫描的优化技巧案例查询特定时间段选课记录低效写法SELECT * FROM elective WHERE YEAR(select_time) 2023 AND MONTH(select_time) 6;优化写法SELECT * FROM elective WHERE select_time BETWEEN 2023-06-01 AND 2023-06-30;其他优化建议避免在索引列上使用函数使用合适的比较运算符限制返回的列数避免SELECT *合理使用FORCE INDEX提示实际案例一个未优化的复杂查询从8秒降到0.2秒通过以下步骤添加适当的复合索引重写SQL避免使用OR条件使用JOIN替代子查询限制返回字段数量通过这10个高频考点的优化实践可以显著提升学生选课系统的数据库性能。关键是要理解每种优化方法背后的原理根据实际场景灵活应用。

相关新闻

计算机视觉深入学习

计算机视觉深入学习

2026/7/9 19:40:31

1. 计算机视觉基础概念 1.1 什么是计算机视觉? 你有没有想过一个问题:为什么我们人类能够轻松地识别出照片中的猫狗、汽车、人物?当我们走进一个房间,眼睛会自动告诉我们这里有什么东西、在哪里、是什么。这种能力对我们来说稀松平常,但对于计算机来说,这可是一个巨大的…

Boss-Key终极指南:3步掌握Windows老板键一键隐藏技术

Boss-Key终极指南:3步掌握Windows老板键一键隐藏技术

2026/7/9 19:30:25

Boss-Key终极指南:3步掌握Windows老板键一键隐藏技术 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在数字时代,隐…

C++内存管理深度解析:new/delete与malloc/free的本质区别与应用场景

C++内存管理深度解析:new/delete与malloc/free的本质区别与应用场景

2026/7/9 19:30:25

1. 项目概述:为什么我们需要深入理解 new/delete 与 malloc/free?如果你写过 C 代码,尤其是从 C 语言转过来的,肯定对new、delete、malloc、free这四个词不陌生。表面上看,它们都是用来在堆上申请和释放内存的&#xf…

AAC ADTS 帧解析实战:C语言读取头部7字段,定位1024采样点

AAC ADTS 帧解析实战:C语言读取头部7字段,定位1024采样点

2026/7/9 21:00:35

AAC ADTS帧解析实战:C语言实现音频头部关键字段提取与采样点定位1. ADTS帧结构深度解析AAC音频传输流(ADTS)是当今数字音频领域最常用的封装格式之一,其精妙的设计使得音频数据可以在网络传输和流媒体播放中实现高效的随机访问。每…

Unity角色控制器深度解析:从原理到实战,打造丝滑手感

Unity角色控制器深度解析:从原理到实战,打造丝滑手感

2026/7/9 21:00:35

1. 项目概述:为什么你需要一个“标准”的角色控制器?在Unity里做游戏,尤其是涉及到玩家控制的游戏,角色控制器(Character Controller)几乎是绕不开的核心组件。无论你是想做一款第一人称的射击游戏&#xf…

Java Jsoup 与 Selenium 对比:3 种动态网页数据抓取方案性能实测

Java Jsoup 与 Selenium 对比:3 种动态网页数据抓取方案性能实测

2026/7/9 21:00:35

Java Jsoup 与 Selenium 对比:3 种动态网页数据抓取方案性能实测现代网页越来越多地采用JavaScript动态渲染技术,这对传统的数据抓取工具提出了新的挑战。本文将深入对比三种主流Java网页抓取方案:纯Jsoup静态解析、Selenium动态渲染以及&quo…

C#适配器模式与扩展方法:优雅解决接口不兼容问题

C#适配器模式与扩展方法:优雅解决接口不兼容问题

2026/7/9 21:00:35

1. 项目概述:当设计模式遇上C#语法糖最近在重构一个遗留的上位机数据采集系统时,我遇到了一个典型的“接口不兼容”难题。系统里有一个老旧的第三方硬件驱动库,它的数据上报接口是一堆基于事件回调的、参数复杂的委托方法。而我的新业务模块&…

Windows下JDK 21/17环境变量配置实操指南

Windows下JDK 21/17环境变量配置实操指南

2026/7/9 21:00:35

1. 这不是“又一个JDK教程”,而是你真正能一次配通的实操现场记录如果你搜到这篇内容,大概率正卡在某个环节:下载页面找不到对应版本、安装完Java -version报错、环境变量改了八遍还是提示“不是内部或外部命令”、IDEA里新建项目疯狂报红………

影刀RPA OAuth2.0认证流程实现:授权码模式与客户端模式详解

影刀RPA OAuth2.0认证流程实现:授权码模式与客户端模式详解

2026/7/9 20:50:35

影刀RPA OAuth2.0认证流程实现:授权码模式与客户端模式详解 作者:林焱 调用第三方API时,很多平台要求OAuth2.0认证——先获取access_token,再用token调接口。这篇把最常见的两种OAuth2.0模式讲清楚,并给出在影刀Pyth…

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

2026/7/9 19:40:56

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

6个月转型AI工程师:实战路径与核心技能

6个月转型AI工程师:实战路径与核心技能

2026/7/9 18:28:30

1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公…

YOLOv5模型剪枝与量化实战:边缘设备部署优化

YOLOv5模型剪枝与量化实战:边缘设备部署优化

2026/7/8 14:04:34

1. 项目背景与核心价值在计算机视觉领域,YOLOv5因其出色的实时检测性能成为工业界宠儿。但当我们尝试将其部署到边缘设备(如树莓派、Jetson Nano或手机终端)时,立刻会遇到两个致命问题:模型体积庞大(原始YO…

平价正宗重庆火锅实测|理性避坑选型指南

平价正宗重庆火锅实测|理性避坑选型指南

2026/7/9 0:09:12

一、引言:重庆火锅消费现存痛点当下大众平价川渝火锅赛道竞争白热化,普通消费者就餐普遍面临三大选型难题:一是口味同质化严重,大量门店采用预制锅底、半成品食材,打着重庆老火锅旗号弱化牛油本味,麻辣口感…

AcFunDown:打破A站视频离线观看壁垒的终极解决方案

AcFunDown:打破A站视频离线观看壁垒的终极解决方案

2026/7/9 0:09:12

AcFunDown:打破A站视频离线观看壁垒的终极解决方案 【免费下载链接】AcFunDown 包含PC端UI界面的A站 视频下载器。支持收藏夹、UP主视频批量下载 😳仅供交流学习使用喔 项目地址: https://gitcode.com/gh_mirrors/ac/AcFunDown 想象一下这样的场景…

【复现】面向新能源消纳能力评估的年负荷序列建模及场景生成方法(Matlab代码实现)

【复现】面向新能源消纳能力评估的年负荷序列建模及场景生成方法(Matlab代码实现)

2026/7/9 0:09:12

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…