☰
考研数据库9套题刷题法:从SQL到事务的模块化突破
2026/10/11 15:30:23 网站建设 项目流程

简介:这份数据库考研配套题库共9套题,以PDF格式呈现,压缩包仅1个文件,大小1.7MB,已有142人学习。内容紧密围绕数据库系统核心考点编排,以选择题形式覆盖数据管理技术发展、数据库系统概念、三级模式结构、关系运算、SQL语句中的分组与通配符、函数依赖与范式分解、事务持久性、并发控制、存取授权、视图定义等高频知识点,适合报考计算机类研究生、需要系统巩固数据库原理的考生使用。通过逐题演练,可快速检验对关系模型、BCNF范式、事务与并发控制等概念的理解程度,帮助定位薄弱环节、查漏补缺,强化考前记忆。资源体量轻便、知识密度高,可作为数据库科目冲刺阶段的便携自测与复习材料。

1. 考研数据库9套题:别急着刷,先把它当成诊断工具

每年九月开始,总有人拿着“考研数据库9套题.pdf”这类题集问我怎么刷。我的回答通常是:先别急着从头做到尾。数据库题和数学题不一样,你不靠题海战术提分,靠的是把关系模型、SQL、范式、索引、事务、恢复这几个模块的底层逻辑打通。把这九套题当成一台诊断仪,第一遍找病灶,第二遍练手速,第三遍模拟考场心态。这套方法对408统考、自命题院校和求职笔试都管用,适合那些已经学过一遍教材、但一做题就卡壳的考生。九套题不多不少,正好能支撑你三个星期做完一轮完整体检。

2. 把9套题拆成考点地图:刷题顺序、时间分配与错题标记法

拿到PDF先别翻答案。我习惯花半小时把九套题的题型分布列成一张表,再决定先打哪块。很多考生一上来就按顺序刷,结果前两套做完就泄气,因为客观题里的概念辨析题错得一模一样——说明知识骨架没立起来,刷多少套都是原地踏步。

2.1 九套题背后就是这七个模块

考研数据库科目看起来知识点很散,但卷子翻来覆去就是七个模块在换皮。我按往年常考题型和分值权重列了一个对照表,你可以直接拿它给手里这套题做标注。

模块常见题型复习优先级
关系模型与关系代数候选码、闭包、除运算、连接高,大题第一问常在这
数据库SQL增删改查、嵌套查询、视图、触发器最高,主观题半壁江山
范式与关系模式设计函数依赖、无损分解、3NF/BCNF高,每年必有一道
索引与查询优化B+树、执行计划、索引失效中高,选择与大题都出现
事务与并发控制ACID、隔离级别、死锁、两段锁中高,简答常客
数据库恢复与安全日志、检查点、GRANT授权中,背熟就能拿分
国产数据库与NoSQL达梦、人大金仓兼容性,向量数据库等低,自命题院校偶尔串一题

对着这套PDF把每道题归类到模块里,你很快会发现自己的薄弱点集中在哪一块。大多数人不是七个模块都差,而是“关系代数会做、SQL一写就错,范式背得熟、并发概念一绕就晕”。找到短板再动手,比盲目刷完九套效率高得多。

2.2 三轮刷题法:摸底、模块突破、全真模拟的时间与顺序

我把九套题按“三轮刷题法”分配,而不是平均每天一套。第一轮只拆一套出来做摸底,不限时间但要求把每道题写上“为什么选这个答案”,不会的题直接跳,做完统计模块错误率。第二轮是主体,用六到七套题按模块拆开练,比如今天只做所有涉及索引的题,明天只做所有事务题。第三轮留最后一套做全真模拟,严格计时、不翻书、不用补全提示。

轮次用哪几套时长参考判定标准
摸底第1套不限时,细读题干能画出个人错误热力图
模块突破中间六套左右每个模块1-2天同模块错误率明显下降
全真模拟最后1套留白按院校考试时长时间到能写完且正确率稳定

这里有个很容易踩的误区:把整套题拆散之后,有些人会舍不得“浪费”真题。我的看法是,这套题的价值不在于“我完整做过了”,而在于“我掌握了每个模块的出题套路”。拆开刷并不浪费,第二轮的错题统计比第一轮做完打钩有用得多。

2.3 错题本不抄题,记“错误类型码”

刷第二轮时,我会在错题旁边写一个错误类型码而不是抄整道题。用一套自己能记住的编码系统:A代表概念混淆,比如把“不可重复读”和“幻读”搞混;B代表SQL语法或执行逻辑粗心,比如GROUP BY漏了非聚合列;C代表解题流程缺失,比如范式分解没想到先求候选码;D代表时间分配失误,比如在关系代数选择运算上纠结太久。这样二刷只看类型码分布,就能判断自己是知识点漏洞还是考场习惯问题。

有条件的同学可以在第三轮模拟时也给每道题计时,把超时题也标记为D类。我见过太多人错题本抄得整整齐齐,二刷还是错同一道题,因为抄题只复现了“题目长什么样”,没有复现“我当时为什么想错”。错误类型码的价值就在这——它逼着你每次订正都给出一个可复用的判断规则,而不是一句“粗心了”就翻篇。

3. 用本地MySQL把9套题里的SQL题复现出来:从建库到窗口函数

SQL题光看答案永远学不会。我主张把每一道查询题都落到本地数据库里跑一遍,不只为验证答案,还要看看执行计划、试试不同写法结果是否一致。数据库增删改查这类基础操作,你在编辑器里手敲十遍,胜过阅读器里高亮一百行。

3.1 最小环境准备:装一个能跑题的MySQL

如果你手头没有现成的数据库环境,装一个MySQL 8.0以上的版本就够了。Windows和macOS用户直接下载安装包,Linux用户用包管理器装服务端,然后启动服务。不需要装任何图形客户端,练习就老老实实用命令行,考场可没有自动补全。

# Ubuntu/Debian 系安装并启动 MySQL sudo apt update sudo apt install -y mysql-server # 启动服务并确认监听状态 sudo systemctl start mysql sudo systemctl status mysql

装完之后用root登录,执行一条最简单的SELECT验证连通性。这里的逻辑是先确保服务在跑,再确保能登录,最后再建库。如果卡在登录,大概率是安装时没给root设置密码或认证插件不匹配,用sudo mysql -u root免密进去后执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';重置即可。这个错误在本地练习时出现频率极高,先排掉再往后走。

3.2 建表脚本:主键、外键与字符集怎么定

做SQL题最怕没有数据可查。我建议建一个经典的学生-课程库,也就是Student、Course、SC三张表,这几乎覆盖了考研SQL题里一大半的场景:连接查询、嵌套子查询、分组统计、选课情况的“除法”运算。

-- 建库时指定字符集,避免中文乱码 CREATE DATABASE IF NOT EXISTS db_exam DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE db_exam; -- 学生表:学号定长,姓名用 VARCHAR,性别用 ENUM CREATE TABLE student ( sno CHAR(9) PRIMARY KEY, sname VARCHAR(20) NOT NULL, ssex ENUM('M','F') DEFAULT 'M', age TINYINT, sdept VARCHAR(20) ) ENGINE=InnoDB; -- 课程表:学分用 DECIMAL 保留一位小数 CREATE TABLE course ( cno CHAR(4) PRIMARY KEY, cname VARCHAR(40) NOT NULL, credit DECIMAL(3,1) ) ENGINE=InnoDB; -- 选课表:联合主键,外键关联上面两张表 CREATE TABLE sc ( sno CHAR(9), cno CHAR(4), grade DECIMAL(5,2), PRIMARY KEY (sno, cno), CONSTRAINT fk_sc_sno FOREIGN KEY (sno) REFERENCES student(sno), CONSTRAINT fk_sc_cno FOREIGN KEY (cno) REFERENCES course(cno) ) ENGINE=InnoDB;

建表时几个参数值得你较真。ENGINE=InnoDB必须写,因为它是考试重点:支持事务、支持外键、行级锁,这三个特性全都要靠这个引擎。utf8mb4字符集用于课程名和学生姓名这类中文数据,如果建库时忘了指定,后面插入中文容易变成乱码。DECIMAL(3,1)表示最多三位数、一位小数,学分存2.5没问题;成绩用DECIMAL(5,2)是为了统一精度,避免浮点误差在GROUP BY和排序时算出意外结果。CHAR(9)和VARCHAR(20)的差别也是高频考点:定长CHAR适合学号这种长度恒定且需要频繁检索的列,姓名字段长短不定,用VARCHAR更省空间。

3.3 增删改查与子查询:考研最爱考的三类查询模板

建完表先插入几行数据,然后照着试卷里的问答练。插入语句本身就是一道“数据库增删改查”的送分题,但很多人手写INSERT时会漏字段或写错引号,多练没坏处。

-- 插入测试数据,注意外键依赖:先插主表,再插从表 INSERT INTO student (sno, sname, ssex, age, sdept) VALUES ('20230001', '赵敏', 'F', 21, 'CS'), ('20230002', '张无忌', 'M', 22, 'CS'), ('20230003', '周芷若', 'F', 22, 'MA'); INSERT INTO course (cno, cname, credit) VALUES ('C001', '数据库', 4.0), ('C002', '操作系统', 3.5); INSERT INTO sc (sno, cno, grade) VALUES ('20230001', 'C001', 92.5), ('20230002', 'C001', 86.0), ('20230003', 'C001', 78.5);

接着是必考的“选修了数据库课且成绩大于85的学生名单”和“至少选修了某学生全部课程的学生”这两类题。前者是两表连接加WHERE过滤,后者是双重NOT EXISTS实现关系除法,我建议把这两个模板背到条件反射的程度。

-- 第一类:等值连接 + 行过滤 SELECT s.sname, sc.grade FROM student s JOIN sc ON s.sno = sc.sno JOIN course c ON sc.cno = c.cno WHERE c.cname = '数据库' AND sc.grade > 85; -- 第二类:查询至少选修了20230001学生全部课程的学生学号 SELECT DISTINCT sc1.sno FROM sc sc1 WHERE NOT EXISTS ( SELECT cno FROM sc sc2 WHERE sc2.sno = '20230001' AND NOT EXISTS ( SELECT 1 FROM sc sc3 WHERE sc3.sno = sc1.sno AND sc3.cno = sc2.cno ) );

第一类查询的JOIN写法要注意别名:表名一长,ON条件写错列名就要排查半天。第二类双重NOT EXISTS的逻辑是“不存在任何一门课,这个学生没选而参考学生选了”,这是SQL实现集合除法的标准套路。你在考场上如果遇到“查询选了全部课程的学生”,本质就是把固定学号换成全部课程集合,再加一层NOT EXISTS。

3.4 排名题:ROW_NUMBER、RANK、DENSE_RANK的差别

最近几年数据库SQL题很爱考窗口函数,尤其是排名类。三个函数的区别是简答题常客,也是写查询题时最容易出错的地方。用同样的成绩数据分别跑一下,结果差异一目了然。

-- 窗口函数排名对比,注意同分时的名次处理 SELECT s.sname, sc.grade, ROW_NUMBER() OVER (ORDER BY sc.grade DESC) AS rn, RANK() OVER (ORDER BY sc.grade DESC) AS rk, DENSE_RANK() OVER (ORDER BY sc.grade DESC) AS drk FROM student s JOIN sc ON s.sno = sc.sno WHERE sc.cno = 'C001';

ROW_NUMBER不管成绩是否一样,强制分出名次;RANK遇到并列名次会跳过,比如两个第一后面直接是第三;DENSE_RANK并列后不跳号,第二就紧接着出现。考试如果要求“按成绩排名,同分同名次”,选RANK或DENSE_RANK视题目是否要求连续编号。书写时记得OVER子句里的ORDER BY方向要写成DESC,漏掉方向直接导致名次颠倒。

3.5 事务与死锁:两个会话复现数据库死锁

只看书永远想象不出数据库死锁长什么样,但本地复现一次就忘不掉。打开两个终端同时连进MySQL,按下列顺序执行。

-- 会话A:锁定学号为20230001的学生行 START TRANSACTION; UPDATE student SET age = age + 1 WHERE sno = '20230001'; -- 此时不要提交,先到会话B执行 -- 会话B:锁定学号为20230002的学生行 START TRANSACTION; UPDATE student SET age = age + 1 WHERE sno = '20230002'; -- 回到会话A,执行下面这条,会进入锁等待 UPDATE student SET age = age + 1 WHERE sno = '20230002'; -- 再回到会话B,执行下面这条,产生循环等待 UPDATE student SET age = age + 1 WHERE sno = '20230001';

这个实验的关键是理解锁的申请顺序。A先锁了1号行想申请2号行,B先锁了2号行想申请1号行,双方都等对方释放,InnoDB检测到死锁后会选一个代价较小的事务回滚。玩这个实验你会彻底记住行锁不是锁整条语句,而是锁具体行资源。顺便看看SHOW ENGINE INNODB STATUS里LATEST DETECTED DEADLOCK片段,考场上问你“死锁怎么排查”,能写出来这条命令已经比大部分考生强。

4. 理论题按答题结构拿分:范式、索引、事务隔离与恢复

理论题最怕背原话。判卷老师看的不是你能不能默写定义,而是你能不能按步骤分析和推理。这章我把四个高频理论题型各拆出一套答题结构,你照着这个顺序写,即使最后结论有偏差也能拿到过程分。

4.1 范式题:从函数依赖到3NF/BCNF的固定答题链

范式题的死法只有一种:凭感觉拆分。正确的打开方式是先列函数依赖集,再求候选码,最后逐条判断每个函数依赖的左边是否包含候选码。

范式核心要求答题时验证点
1NF属性不可再分检查是否存在复合属性
2NF消除非主属性对候选码的部分函数依赖候选码是联合码时,逐列检查
3NF消除非主属性对候选码的传递函数依赖找X→Y,Y→Z且Y不含候选码
BCNF每一个决定因素都包含候选码所有函数依赖的左边都检查一遍

答题时按四步走:第一步写出所有函数依赖F;第二步求出候选码,常见算法是看哪些属性只在F左边出现或者压根不出现,再结合闭包验证;第三步从1NF开始逐级判断题中关系属于第几范式;第四步如果不符合要求,选一个违反条件的函数依赖做分解,分解完必须验证无损连接和依赖保持。无损连接判断就用表格法,逐行填入属性,看最后是否有一行全为a;依赖保持则检查分解后的函数依赖闭包是否等于原来的闭包。这两步是判卷给分点,漏任何一个都会被扣过程分。

4.2 索引题:为什么是B+树,以及索引失效的六个场景

索引题先答为什么选B+树:树高矮、扇出大,三层就能支撑千万级数据,而且叶子节点有链表,范围查询不用回根节点重新遍历。AVL树和红黑树在这个场景下都会输在磁盘IO次数上,这个比较逻辑要写清楚。接着是索引失效场景,我把最有代表性的整理成表,选择题和简答题都能直接用。

失效场景示例原因
前导列LIKEWHERE name LIKE '%明'无法利用B+树有序性
隐式类型转换WHERE age = '22',age是数字列触发类型转换导致全表扫
对索引列做函数运算WHERE YEAR(birth) = 2000索引树里存的是原值
OR连接非索引列WHERE id = 1 OR name = 'x'优化器改走全表扫描
联合索引没用最左前缀索引(a,b),条件只写b无法定位a前缀
统计信息严重过期数据量剧变优化器误用全表扫

答索引失效题时,别只答现象,补一句“本质是B+树的有序性无法被利用”,这句话很能提分。如果题目给了一条慢SQL让你优化,答题顺序是:先EXPLAIN看type字段,然后看是否索引失效,再尝试改写SQL结构,最后说调整索引设计。

4.3 事务并发题:脏读、不可重复读、幻读对照表

事务并发这部分,我建议用一种“讲给外行听”的方式记忆:脏读是读到别人没提交的修改;不可重复读是同一行数据,你读两次结果不一样;幻读是两次查询返回的行数不一样,多出来的行像幻觉一样出现。三个问题对应的隔离级别可以用一张表打通。

隔离级别脏读不可重复读幻读
READ UNCOMMITTED可能可能可能
READ COMMITTED不可能可能可能
REPEATABLE READ不可能不可能可能
SERIALIZABLE不可能不可能不可能

答题结构先写ACID四性质,再逐个说明隔离级别解决了哪个问题。这里有个容易丢分的知识点:MySQL的REPEATABLE READ靠MVCC和间隙锁,在大部分场景下已经能阻止幻读,但标准的SQL规范里RR仍然允许幻读。你要看题目问的是“符合SQL标准”还是“MySQL默认行为”,这两种答法不一样。换到Oracle数据库上,默认隔离级别是READ COMMITTED,MySQL默认是REPEATABLE READ,这种差异对比也是简答常客。

4.4 数据库恢复题:REDO、UNDO、检查点怎么配合

恢复题拿分的关键是把顺序理清楚。系统崩溃后,数据库要先看日志:对已经提交的事务,用REDO重做,把数据恢复到提交后的状态;对未提交的事务,用UNDO回滚,撤销修改。REDO保证持久性,UNDO保证原子性。

检查点CHECKPOINT的作用是定期把脏页写回磁盘,顺便记录日志位置。有了检查点,崩溃恢复时不需要重放整个日志,只从检查点开始往后处理。答题时可以画一条时间轴:检查点之前的已提交事务不用管,检查点之后的事务再逐个判断提交与否。数据库同步软件在生产环境做的事,本质上就是把这些日志传输到另一台机器再重放,理解了这个原理,主从复制的考题也不难回答。

5. 刷这套题的5个常见坑:从建库不验证到死锁复现不出来

刷题过程里最容易翻车的不是知识点本身,而是学习方法上的偏差。我见过的考生踩的坑高度一致,写出来供你对照排雷。

5.1 只背理论不建库,SQL题一写就翻车

现象:范式、事务概念背得滚瓜烂熟,一到手写SQL题就漏JOIN条件、多写逗号、忘记GROUP BY的非聚合列。原因:一直用眼睛“看”SQL,从没让数据库报过错,语法错误全靠脑补。解决:把第3章的三张表在本地建好,每道SQL题都要实际跑通,跑不通就把报错信息当线索排查。我的经验是,能跑通的查询才算真会了,“大概能写出来”在考场上多半写不出来。

5.2 子查询能跑通但不看执行计划,慢查询一样是失分点

现象:查询题写出来结果是对的,但考试加问一句“这条SQL怎么优化”,直接愣住。原因:练习时只关注结果集,从不看数据库怎么执行,脑子里没有执行计划的意识。解决:以后每写完一条复杂查询,顺手跑一次EXPLAIN SELECT ...,只看三个字段:type是否全表扫ALL、key是否命中索引、rows扫描行数。一旦你习惯在练习时留意这些,考场上遇到优化题自然有话说。

5.3 隔离级别只会背概念,复现脏读和不可重复读时卡壳

现象:能把四个隔离级别倒着背,但被问到“脏读在READ COMMITTED下还会出现吗”就犹豫。原因:没有亲手在一个隔离级别下跑过两个并发事务,概念和现象对不上。解决:开两个MySQL会话,一个执行更新不提交,另一个查同一行数据,把隔离级别从READ UNCOMMITTED逐级调到SERIALIZABLE,亲眼看看哪个级别下能读到未提交数据。数据库死锁的复现实验同理,第3.5节给过完整步骤,跑一遍比背十遍都管用。

5.4 范式分解全凭感觉,拆完才发现既不无损也不保持依赖

现象:把一个关系模式拆成两个,看着“挺正常”,但问起为什么这么拆、怎么验证,说不出来。原因:跳过了函数依赖集和候选码的计算,直接跳到拆分步骤。解决:每次范式题先写出完整函数依赖F,再求候选码,然后按第4.1节的四步走。分解完之后,无条件做无损连接表格验证,再逐条核对依赖保持性。这两个验证步骤就是判卷给分点,跳过等于白拆。

5.5 用图形工具掩盖了手写SQL的能力,一上考场就露馅

现象:平时用Navicat或DataGrip画表、点按钮、看结果很溜,笔试要求手写CREATE TABLE时,字段类型、约束、主外键写法错得离谱。原因:图形工具把数据库建表和查询的语法细节都代填了,手写能力长期闲置。解决:练习阶段回到命令行,所有建表、插入、查询都手敲,建完表再用SHOW CREATE TABLE student;对照检查自己的DDL有没有漏约束。这个习惯同时能帮你理解mysql数据库修改结构这类操作的本质——所有ALTER TABLE语句都依赖你对现有表结构的准确判断。

6. 二刷三刷时怎么验证你真的会了:定时、讲题、看执行计划

九套题刷完三轮,怎么确认自己没有“假会”?我给自己定了三个硬性验证动作,缺一不可。

第一,给所有慢查询做执行计划对比。挑一道你二刷时犹豫过的SQL题,先不看答案写一版,跑EXPLAIN,记录type和key;再改写一个WHERE条件或JOIN顺序,看看扫描行数有没有变化。如果你能说出“为什么这个条件让索引失效了”而不是“反正结果对”,这道题才算是真正消化了。

第二,把每套题的大题当成面试题,对着空气讲一遍。用“题目问什么→我给出的答案是什么→为什么是这样”的结构讲,讲不流畅的地方就是知识缺口。我有一个笨办法:打开手机录音讲,回放时听到“嗯”“那个”“不对”卡壳超过三次,就回去翻书重学。这个习惯救过我很多次,因为输入式学习和输出式学习在大脑里走的是完全不同的通路。

第三,留到最后的全真模拟要完全仿真:定好时间、合上书、关掉自动补全、手写SQL不执行。对答案时不要只算总分,按第2.3节的错误类型码统计分布。如果三刷以后B类语法粗心占比仍然很高,说明练习时的姿势不对——你可能一直在看答案敲代码,而不是默写代码。重写最后一轮时,把每个查询题先在纸上写一遍再去执行,强制大脑进入考场状态。

我当年刷题最吃亏的地方,就是只背正确答案不背错误原因,二刷三刷总在同一种题型上栽跟头。后来把每道大题当作一场口头面试反复输出,正确率才真正稳下来。这套九套题能让你走多远,不取决于它有多少题,而取决于你有没有把它从一本“题集”变成一套可诊断、可复现、可验证的个人训练方案。希望帮到你。

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

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

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

立即咨询