☰
数据库期末考试试题及答案:考前刷题与SQL实操避坑指南
2026/10/14 12:36:33 网站建设 项目流程

简介:面向数据库课程期末复习的试题与答案文档,覆盖数据库系统核心概念、概念模型与数据模型、关系数据模型、E-R模型转换、关系规范化、事务隔离性、数据库恢复、SQL授权与并发控制等高频考点,适合高校学生考前自测与查漏补缺。压缩包内为1个doc文件,共118KB,文档包含20道单项选择题和若干填空题,每道题均配有参考答案;其中单选部分对DBMS核心、数据物理独立性与逻辑独立性、关系运算、主码判定、全外联接、GRANT语句、最小关系系统、候选码与函数依赖、S锁/X锁、两段锁协议、丢失修改与脏数据等易混淆知识点作了清晰辨析;填空题则针对性检验关系数据结构与操作、唯一索引建立、自然连接条件、谓词等价改写、候选码及范式判定、分E-R图属性冲突处理等内容。该资源在CSDN已有3787人学习下载,整体内容紧凑,可帮助备考者快速定位薄弱环节,系统回顾数据库原理的常考题型,适合期末冲刺阶段集中训练。

1. 数据库期末考试试题及答案:为什么考前刷题比背书更管用

数据库期末考试临近,课本翻完一遍,SQL也照着例子敲过几道,但拿到往年真题还是发蒙——这种情况我见得太多了。这时候缺的不是知识点,而是一份能把考点、题型、标准答案对照起来的“数据库期末考试试题及答案”。它把概念题、关系代数题、SQL题、范式题、事务并发题按期末卷子结构排好,每道题都带答案和解析,能让你在短时间里看清考点长什么样、答案该踩准哪些采分点。适合正在备考的在校生,也适合想快速捡起数据库基础的开发者。

2. 试题覆盖的知识点:从ER图到事务隔离,期末卷子最爱考什么

拿到这套题,先别急着从头刷到尾。把它当成一张考点地图,比盲目做题高效得多。数据库期末卷子结构相对固定,不同学校风格可能有差异,但知识点基本围绕关系模型、SQL、关系代数、范式、事务并发这几块转。这套题在这些模块上都有覆盖,下面把每个模块的考点和答题采分点拆开说。

2.1 概念题:关系模型、完整性约束与视图

概念题一般占30到40分,形式是选择、填空、简答,考得最多的就是关系模型、完整性约束和视图。关系模型三要素是关系结构、关系操作、完整性约束;完整性约束又分实体完整性、参照完整性和用户定义完整性。实体完整性要求主键不为空,参照完整性要求外键的值要么为空,要么在被参照表主键中存在。这两个定义看起来简单,但考试经常会换成场景问“某个操作违反了什么完整性”,这时候你得先判断字段属于主键还是外键。

视图和基本表的区别更是高频简答。标准答案要覆盖四点:视图是虚拟表,不存储数据,只存储定义;基本表存储实际数据;对视图的更新最终映射到基本表且受到限制;视图能隐藏列和行,起到安全保护作用。答这类题不能只写一句“视图是虚拟表”,要把四点完整列出来,阅卷是踩点给分的。

我把试题解析里高频出现的对比点整理成了表格,考试前扫一眼就能加深记忆:

对比项基本表视图
存储独立存储数据不存储数据,只存定义
更新直接更新受限,受基表约束
删除直接删除数据删视图不影响基表数据
作用数据载体安全控制、逻辑独立

另外,视图定义中的WITH CHECK OPTION也是常考小点。它表示对视图进行INSERT和UPDATE时必须满足视图定义的条件,否则数据库拒绝操作。很多同学会漏掉这个选项,但它常常出现在选择题的陷阱里。

2.2 SQL实操题:增删改查从DML到聚合查询

SQL题是期末卷子的重头戏,通常占30到40分。题目一般是给一个学生选课的表结构,要求写出若干条SQL,偶尔穿插INSERT、UPDATE、DELETE。这套题里的SQL覆盖面很全,从单表查询到多表连接、子查询、聚合函数都有。

以“查询选了‘数据库原理’课程的学生姓名和成绩”为例,涉及Student、Course、SC三张表。标准答案有三种写法,我建议都掌握:

-- 方式1:等值连接 SELECT Sname, Grade FROM Student s, SC sc, Course c WHERE s.Sno = sc.Sno AND sc.Cno = c.Cno AND c.Cname = '数据库原理'; -- 方式2:INNER JOIN SELECT Sname, Grade FROM Student s JOIN SC sc ON s.Sno = sc.Sno JOIN Course c ON sc.Cno = c.Cno WHERE c.Cname = '数据库原理'; -- 方式3:IN子查询 SELECT Sname, Grade FROM Student WHERE Sno IN ( SELECT Sno FROM SC WHERE Cno = ( SELECT Cno FROM Course WHERE Cname = '数据库原理' ) );

方式1是传统逗号连接,逻辑直白,适合手写答卷;方式2是ANSI标准连接,语义清晰,是开发环境推荐写法;方式3用子查询嵌套,在只允许单表操作的题目里也能用。答题时别只写一种,如果时间允许,多写一种等价写法能增加得分概率,哪怕其中一种少写了条件,另一种也可能帮你保住分数。

除了SELECT,增删改查也是必考。这类题喜欢在事务边界上设陷阱,比如“删除选了‘数据库原理’课程的所有选课记录”和“删除课程表中的‘数据库原理’课程”是两件事。后者会因外键约束失败,必须先删SC再删Course。答案里通常会明确写出两条SQL的顺序,顺序反了就是零分。

聚合查询里,WHERE和HAVING的区别也是一个高频考点。WHERE在分组前过滤行,HAVING在分组后过滤组。题目如果让你“查询平均成绩大于80分的学生”,必须用HAVING,因为平均成绩是分组聚合后的结果,WHERE里不能包含聚合函数。

SELECT Sno, AVG(Grade) AS avg_grade FROM SC GROUP BY Sno HAVING AVG(Grade) > 80;

这个点几乎每年都考,但这套题里对应的答案会同时给出错误写法和正确写法,你可以把错误写法里的WHERE AVG(Grade) > 80直接划掉,旁边写上“聚合过滤用 HAVING”。

2.3 关系代数与范式判断:很多人丢分的重灾区

关系代数题在课本里占篇幅不小,但很多人刷题时直接跳过,考场上才发蒙。期末它通常以小问出现,比如“用关系代数表达式表示‘查询选了全部课程的学生’”,这题用除运算最合适,但很多同学写成连接加分组,逻辑上就不对。关系代数的解题关键是先识别操作符:选择对应行的过滤,投影对应列的裁剪,连接对应多表关联,除对应“全部/至少”这种语义。

范式判断更是重灾区。给一个关系模式,让你判断属于第几范式并说明原因。判断步骤必须按顺序来:先找候选键,再分析函数依赖,最后判断是否存在部分依赖和传递依赖。1NF要求属性不可再分,2NF要求消除非主属性对候选键的部分依赖,3NF要求消除传递依赖,BCNF要求所有函数依赖的决定因素都包含候选键。

很多同学把部分依赖和传递依赖混在一起,导致结论差一级。举个例子:关系模式R(学号, 课程号, 成绩, 教师姓名),候选键是(学号, 课程号)。其中教师姓名由课程号决定,而课程号只是候选键的一部分,所以教师姓名对候选键存在部分依赖。因此R只满足1NF,不满足2NF。如果你把它当成传递依赖,结论就会错成3NF。

判断传递依赖的正确场景是X→Y,Y→Z,且Y不是候选键,Z不是候选键的一部分。比如R(学号, 班级号, 班长姓名)中,学号→班级号,班级号→班长姓名,班长姓名对学号就是传递依赖。做题时把函数依赖图在草稿纸上画出来,标出候选键,再逐条判断,正确率会高很多。

2.4 事务、并发控制与数据库优化

事务相关题通常是简答或设计题,考ACID、隔离级别、死锁。ACID四个特性要能背出英文和中文,以及每个特性靠什么机制保证:原子性靠undo日志,一致性靠约束和日志,隔离性靠锁机制,持久性靠redo日志。这个对应关系是简答题的采分点,很多同学丢分是因为只写特性的解释,没写实现机制。

隔离级别是另一个常考点。四个级别分别是读未提交、读已提交、可重复读、可串行化,要能说清楚每个级别允许或禁止哪种现象。这里有一张对照表:

隔离级别脏读不可重复读幻读
读未提交可能可能可能
读已提交禁止可能可能
可重复读禁止禁止可能
可串行化禁止禁止禁止

最容易被绕进去的是“可重复读能不能避免幻读”。标准SQL里不能,但MySQL的InnoDB在可重复读级别下通过间隙锁,在一定场景下能避免幻读。这套题里对这个点有明确解析,建议把答案重点标注,因为期末和面试都爱考。

死锁题一般给两个事务的加锁顺序,问是否会发生死锁。解题思路是画等待图:看每个事务持有哪个锁,请求哪个锁,如果形成环就会死锁。数据库死锁的防治方法包括一次封锁法、顺序封锁法,以及引入死锁检测后撤销代价最小的事务。简答题答出这三条基本就能拿满。

优化题从索引切入。常见问法是“为什么索引能提高查询效率,但索引不是越多越好”。答案要写:索引底层是B+树,可以减少IO次数;但索引占用额外空间,且增删改时需要维护索引树,所以写性能会下降。这套题里的优化题答案一般都附带一个EXPLAIN例子,后面第三章我会带你实际跑一遍。

3. 把试题答案搬进MySQL:用真实环境验证每一道SQL题

刷题的时候你会发现,纸质答案写得再清楚,也不如自己在数据库里跑一遍印象深。尤其是SQL题,答案可能因为数据库版本、sql_mode、字符集而出现不一样的结果。我一般会建议把这套题里的SQL题全部拿到MySQL 8.0里验证一遍,顺便把建表脚本存成SQL文件,以后复习直接导入。

3.1 搭建练习环境:MySQL 8.0 + Navicat或命令行

不需要复杂环境,本地装一个MySQL 8.0,再加一个Navicat图形客户端,或者直接用mysql命令行都行。如果你用的是达梦或者人大金仓这类国产数据库,这套题的SQL大部分也能跑,但要注意分页、自增列、字符串拼接等语法差异。从这套题对应的场景来看,MySQL是通用性最高的选择。

建库建表脚本可以直接从试题的题目描述里提炼。以学生选课为例,最小结构是这三张表:

CREATE DATABASE IF NOT EXISTS school DEFAULT CHARSET utf8mb4; USE school; CREATE TABLE Student ( Sno CHAR(10) PRIMARY KEY, Sname VARCHAR(20) NOT NULL, Sage TINYINT, Sdept VARCHAR(20) ); CREATE TABLE Course ( Cno CHAR(4) PRIMARY KEY, Cname VARCHAR(20) NOT NULL, Credit TINYINT ); CREATE TABLE SC ( Sno CHAR(10), Cno CHAR(4), Grade DECIMAL(5,2), PRIMARY KEY (Sno, Cno), FOREIGN KEY (Sno) REFERENCES Student(Sno), FOREIGN KEY (Cno) REFERENCES Course(Cno) );

参数说明:CHAR用于定长学号和课程号,查询性能比VARCHAR稳定;Sage和Credit用TINYINT足够,取值范围 -128 到 127,年龄和学分都够用;Grade用DECIMAL(5,2)表示总位数5位、小数位2位,能存 0 到 999.99。SC表的联合主键是(Sno, Cno),这保证了“同一个学生选同一门课只能有一条记录”,也是后面理解外键约束和范式判断的实物基础。

3.2 用试题中的DML语句做增删改查实验

环境搭好后,先把试题里出现的INSERT、UPDATE、DELETE都过一遍。很多题会掺杂边界情况,比如插入一条违反唯一约束的记录,或者删除外键被引用的记录。这些只有实际跑过才有体感。

-- 插入学生 INSERT INTO Student (Sno, Sname, Sage, Sdept) VALUES ('2021001', '张三', 20, 'CS'), ('2021002', '李四', 21, 'IS'); -- 插入课程 INSERT INTO Course (Cno, Cname, Credit) VALUES ('C001', '数据库原理', 4), ('C002', '操作系统', 3); -- 插入选课记录 INSERT INTO SC (Sno, Cno, Grade) VALUES ('2021001', 'C001', 88.5), ('2021002', 'C001', 92.0);

执行完后用SELECT * FROM SC确认结果。这里要注意的是,外键约束要求父表先有数据,所以插入顺序必须是 Student、Course、SC,顺序颠倒会报1452错误。这套答案里很多删除题的顺序陷阱,本质上就是外键约束的方向问题。养成“先父后子插入,先子后父删除”的习惯,后面课程设计也能少踩一半坑。

3.3 聚合查询与分组陷阱:only_full_group_by

聚合函数和GROUP BY是SQL实操题的重灾区。MySQL 8.0默认开启only_full_group_by,如果SELECT的列没有出现在GROUP BY里,也没有被聚合函数包裹,查询会直接报错。这套题里有些答案来自旧教材,写法上可能没考虑这个模式。

举个例子,题目是“统计每个系的学生人数,并显示系名”,正确答案是:

SELECT Sdept, COUNT(*) AS student_count FROM Student GROUP BY Sdept;

但有些旧答案会把Sname也加进SELECT,在 MySQL 5.7 之前的版本可能还能跑,8.0 直接报错。遇到这种情况,不是答案错了,而是 SQL 模式变了。如果你需要在旧写法下跑通,可以用SET SESSION sql_mode = 'STRICT_TRANS_TABLES'临时关闭,但我一般不建议,考试和面试都以标准写法为准。

提示:如果报错信息里出现Expression #1 of SELECT list is not in GROUP BY clause,第一反应应该是去检查 SELECT 列是否都被 GROUP BY 覆盖或被聚合函数包裹,而不是去关 sql_mode。

3.4 用EXPLAIN验证优化题答案

试题里关于索引的简答题,可以用EXPLAIN在真实数据上验证。比如“为 SC 表的 Grade 字段建立索引,观察查询性能变化”,先写一条查询,再用EXPLAIN看执行计划。

-- 建立索引前 EXPLAIN SELECT * FROM SC WHERE Grade > 90; -- 建立索引 CREATE INDEX idx_grade ON SC(Grade); -- 建立索引后 EXPLAIN SELECT * FROM SC WHERE Grade > 90;

前后对比type字段:建立索引前是ALL,说明全表扫描;建立索引后变成了range或ref,说明走了索引。rows字段也会明显下降。这个实验做完,你对“为什么索引能优化查询”的理解就比背书深多了。

但需要注意,索引不是越多越好。你可以在同一张表上多建几个索引,再用UPDATE语句测试,观察写入延迟。因为插入和更新除了操作数据本身,还要维护索引树,索引越多,维护成本越高。这套题里关于索引的简答,答案就是围绕这个平衡展开的。

4. 刷题避坑指南:答案里的SQL跑不过,问题多半出在这五处

我在用这套题做复现验证的时候,遇到过不少“答案明明对,但执行就报错”的情况。这些问题不是题目本身错,而是教材、数据库版本、环境配置和标准SQL之间的差异。下面这五条是从最多人翻车的场景里挑出来的,每一条都按现象、原因、解决三个步骤拆开,方便你对照排查。

4.1 现象:GROUP BY查询报错“only_full_group_by”

印象里有一次,我给学弟发了一段“统计每个系选课人数”的SQL,他复制到本地MySQL 8.0直接报错。现象就是执行类似下面的语句时,提示Expression #2 of SELECT list is not in GROUP BY clause。

-- 会报错的写法 SELECT Sdept, Sname, COUNT(*) FROM Student GROUP BY Sdept;

原因是 MySQL 8.0 默认开启only_full_group_by,SELECT 中的每一列要么出现在 GROUP BY 里,要么被聚合函数包裹。旧教材很多 SQL 是照着 SQL Server 或 MySQL 5.6 写的,并没有遵守这个约束。解决方法是把不在 GROUP BY 里的 Sname 去掉,或者用聚合函数处理。真正要统计“每个系人数”时,只需要 Sdept 和 COUNT(*)。

-- 正确写法 SELECT Sdept, COUNT(*) AS student_count FROM Student GROUP BY Sdept;

如果还要过滤平均分大于 80 的系,用HAVING,不能在WHERE里用聚合函数。另外,你可以用SELECT @@sql_mode;查看当前模式,确认是否包含only_full_group_by。考试时别想着改数据库配置,按标准写法写才能真正拿分。

4.2 现象:子查询里用了ORDER BY,直接语法报错

第二类高频翻车是“查询每门课成绩最高的学生”这类题。很多参考答案会写成:

-- MySQL不支持的写法 SELECT * FROM SC WHERE Grade IN ( SELECT Grade FROM SC ORDER BY Grade DESC LIMIT 1 );

MySQL 会提示This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'。原因是 IN 子查询里不允许直接使用ORDER BY和LIMIT,这是语法层面限制,不是逻辑问题。解决方法是改用窗口函数或自连接。MySQL 8.0 支持窗口函数,优先用它:

-- 窗口函数写法 SELECT Sno, Cno, Grade FROM ( SELECT Sno, Cno, Grade, ROW_NUMBER() OVER (PARTITION BY Cno ORDER BY Grade DESC) AS rn FROM SC ) t WHERE rn = 1;

PARTITION BY Cno表示按课程分区,在每个分区内按 Grade 排序。如果你在笔试卷上不能写窗口函数,可以用自连接取最大值:

-- 自连接写法 SELECT sc1.* FROM SC sc1 LEFT JOIN SC sc2 ON sc1.Cno = sc2.Cno AND sc1.Grade < sc2.Grade WHERE sc2.Sno IS NULL;

这个写法的思路是找出“不存在比它分数更高的同课程记录”的行,逻辑上和“取最大值”等价。如果题目环境是 MySQL 5.7 及以下,自连接是更稳的方案。

4.3 现象:外键约束导致DELETE失败,报错1451

第三种坑是执行删除题目答案时,报错Cannot delete or update a parent row: a foreign key constraint fails。我一开始也遇到过,比如直接删除 Course 表里的 C001,但 SC 表里还有选课记录引用它,InnoDB 就会拒绝操作。

原因是默认外键约束的ON DELETE行为是RESTRICT或NO ACTION,禁止删除被引用的父表记录。解决方法是先删子表引用,再删父表记录:

DELETE FROM SC WHERE Cno = 'C001'; DELETE FROM Course WHERE Cno = 'C001';

如果你想保留父表删除能力,同时让子表自动清理,可以把外键定义改成ON DELETE CASCADE。但这里要提醒一句:业务上是否该级联删除,要看需求。学生选课成绩属于历史数据,课程删了成绩还在,这时就不能用 CASCADE,而是用逻辑删除,给 Course 表加一个 status 字段。期末答题时写“先删子表再删父表”是标准采分点,别为了显得高级去写 CASCADE。

4.4 现象:可重复读隔离级别下,居然读到了新插入的行

这个坑来自我拿试题里的隔离级别题做实验时。按标准答案,可重复读级别下不应出现不可重复读和幻读,但在 MySQL 里,我开两个会话,一个事务里连续查两次,第二次却多出来了另一会话刚插入的行。当时一度以为答案错了。

原因需要分开说。标准 SQL 说的是可重复读不能避免幻读,而 MySQL 的 InnoDB 在可重复读级别下,通过间隙锁和临键锁,在某些场景下能避免幻读,但不是所有场景。如果你的查询是全表扫描,或者索引没生效,间隙锁覆盖不住,快照读和当前读的差异就会让你看到新插入的行。

解决方法是做并发实验时区分快照读和当前读。普通SELECT是快照读,不加锁读取历史版本;SELECT ... FOR SHARE或SELECT ... FOR UPDATE是当前读,读取最新版本并加锁。想观察幻读,要用当前读,并且查询条件要能走到索引。比如:

-- 事务A BEGIN; SELECT * FROM SC WHERE Sno > '2021001' FOR UPDATE; -- 事务B INSERT INTO SC (Sno, Cno, Grade) VALUES ('2021003', 'C001', 85); COMMIT;

如果事务 B 的插入被阻塞,说明间隙锁生效;如果插入成功,事务 A 再当前读就能看到新行,这就是幻读。刷题时记住一句话:标准答案写“可重复读不能完全避免幻读”,MySQL 的实现只在特定场景下能做到,别拿 MySQL 行为反推标准。

4.5 现象:范式判断结论和答案差一级,反复检查也看不出毛病

第五类坑最隐蔽,因为它没有任何报错提示,只有对错之分。我在刷范式题时经常犯的错是把部分依赖当成传递依赖,导致结论从 2NF 错判成 3NF。问题往往出在候选键识别不正确或函数依赖写不全。

比如 R(学号, 课程号, 成绩, 教师姓名),候选键是(学号, 课程号),教师姓名由课程号决定。因为课程号是候选键的一部分,所以教师姓名对候选键存在部分依赖,模式只满足 1NF。如果我当时没意识到“课程号是候选键的一部分”,就会误判成传递依赖,得出满足 3NF 的错误结论。

解决方法是严格按步骤走:先把所有函数依赖写全,然后求候选键。求候选键时用属性闭包方法:从候选属性集出发,不断闭包,直到覆盖全部属性。然后用候选键去判断每个非主属性是否存在部分依赖和传递依赖。

-- 范式判断步骤(不是SQL,是分析步骤) 1. 列出所有函数依赖; 2. 用属性闭包求候选键; 3. 检查非主属性是否依赖候选键的一部分; 4. 检查非主属性是否存在传递依赖; 5. 根据结果定级。

把这套题里的范式题全部重做一遍,每道都写清“候选键、函数依赖、最大范式”三行,比背十遍定义都管用。这道题没有银弹,只能靠练习建立肌肉记忆。

5. 从期末试题到数据库课程设计:把题目改成可运行的小项目

试题里的学生选课场景,其实是数据库课程设计最经典的题目之一。与其考完就忘,不如把试题里的 ER 图、SQL、事务、索引知识拼成一个可运行的小项目。这一章我会顺着试题的脉络,把它改造成一个最小可用的选课系统后端,给课程设计和面试项目都留个底。

5.1 把ER图转成建表语句:从实体到物理模型

期末试题通常会给出学生选课的 ER 图,包含学生、课程、选课三个实体以及分数属性。转换成建表语句,就是第三章那几张表,但课程设计还需要加上开课学期、教师、院系这些业务字段。这个转换过程是期末设计题的核心,也是面试常问的“你是怎么设计数据库的”。

我一般会先用表格把实体、属性、联系列清楚,再写 SQL。属性选择遵守两条原则:所有表都要有主键;外键必须指向被引用表的主键或唯一键。如果业务要求删除课程时保留历史成绩,外键就不能用ON DELETE CASCADE,而是用逻辑删除,给 Course 加一个 status 字段,数据还在只是不可用。

-- 扩展后的选课表,增加学期字段 CREATE TABLE SC ( Sno CHAR(10), Cno CHAR(4), Term CHAR(10), Grade DECIMAL(5,2), PRIMARY KEY (Sno, Cno, Term), FOREIGN KEY (Sno) REFERENCES Student(Sno), FOREIGN KEY (Cno) REFERENCES Course(Cno) );

主键从(Sno, Cno)变成(Sno, Cno, Term),是因为同一学期不能重复选课,但不同学期可以。这个细微修改就是课程设计和期末题的差别:期末题是固定表结构,设计题要自己定义业务规则。

5.2 把事务隔离级别题变成并发实验

试题里“设有两个事务,一个读一个写,问会发生什么”这类题,在课程设计里可以变成一次真实的并发测试。开两个 MySQL 会话,一个执行BEGIN后查询成绩,另一个执行更新,然后按不同的隔离级别看结果。这样做一遍,你对脏读、不可重复读、幻读的理解会完全不一样。

-- 会话1 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; SELECT * FROM SC WHERE Sno='2021001'; -- 会话2 UPDATE SC SET Grade = 90 WHERE Sno='2021001'; COMMIT; -- 会话1再次查询 SELECT * FROM SC WHERE Sno='2021001'; COMMIT;

在READ COMMITTED下,会话 1 同一个事务里前后两次查询结果可能不同,这就是不可重复读;如果会话 2 插入一行新数据,会话 1 再次查询会看到新行,这就是幻读。这个实验记录下截图,放进课程设计报告里,比空谈概念更有说服力。

5.3 把优化题变成索引实验

试题里的索引简答题,可以扩展成“对比几个查询在不同索引设计下的执行计划”。我在做课程设计时,会把成绩表用一百万行数据填充,然后用EXPLAIN观察全表扫描和索引扫描的差距。

-- 造数后执行 EXPLAIN SELECT * FROM SC WHERE Grade BETWEEN 90 AND 100; -- 给Grade加索引后再执行一次 CREATE INDEX idx_grade ON SC(Grade); EXPLAIN SELECT * FROM SC WHERE Grade BETWEEN 90 AND 100;

拿真实的 rows 字段数值写进实验报告,比空谈“B+树减少IO”有说服力得多。做完这组实验,期末简答题里“索引的意义和代价”可以直接照着报告写。再进一步,可以试试复合索引,比如(Cno, Grade),然后对比单列索引的执行计划,你会看到索引不是越加越多就好,排列顺序直接影响查询是否走索引。

5.4 延伸:把MySQL答案搬到国产数据库上

如果你的课程设计指定用国产数据库,比如达梦、人大金仓,这套题的 SQL 大部分可以直接运行。常见的差异集中在三处:自增列语法不同,达梦用IDENTITY,MySQL 用AUTO_INCREMENT;分页查询写法不同,达梦需要调整兼容参数,金仓更接近 PostgreSQL 的LIMIT/OFFSET写法;字符串拼接方式不同,MySQL 用CONCAT(),部分国产数据库用||或标准 SQL 函数。

Navicat 连接达梦数据库时,驱动和连接串跟 MySQL 不一样,但建表、查询界面差不多。如果你用的是人大金仓,还可以用 Docker 快速起一个测试环境,减少本机安装的麻烦。这一块不用太紧张,SQL 标准语法是通用的,差异只是皮毛,把第三章的建表语句跑通,再改改差异部分就行。

6. 三遍刷题法:把一套期末题的价值榨干

别拿到题就从头做到尾,那样做一遍记住的比例很低。我自己复习时习惯用三遍法,这套题我建议你也这样用。

6.1 第一遍:合卷限时做

按期末考试的标准时间,比如 120 分钟,合上答案,从头到尾做完。不会的题也写几笔,别空着。这一步是为了暴露问题,不是为了得分。

6.2 第二遍:对照答案拆解

做完后马上对照答案,不只看对错,要重点看解析里的采分点。用不同颜色的笔标注:自己漏了哪个关键词,哪里概念混淆,哪道 SQL 少了一个条件。整理出来的错题清单,就是你接下来三天复习的目录。

6.3 第三遍:自己出衍生题

把做错的知识点变形,自己出题。比如错了一道“查询每门课最高分”的题,就改成“查询每门课最低分”“查询每门课平均分大于80的课程”。如果能自己出题并解答,这个知识点才算真正吃透。

拿我自己的习惯举例,出一道衍生题:“查询选了‘数据库原理’但成绩低于平均分的学生数量”,需要先算平均分,再关联选课表,最后用GROUP BY和HAVING,一套流程走下来比单一查询题覆盖的知识点广得多。衍生题不需要多,一天能出五道并且讲清楚思路就足够了。

从那以后我每次考前突击都强制走一遍这三遍流程,虽然看起来慢,但对数据库这种概念加实操并重的科目,效率反而最高。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询