☰
数据库考研九套题:关系代数、范式与SQL大题全解
2026/10/3 1:36:31 网站建设 项目流程

简介:这是一份面向考研学子的数据库题库PDF,围绕数据库管理技术发展、三级模式结构、关系运算、SQL语句、函数依赖、事务特性与并发控制、数据安全性等核心考点设计,适合数据库原理课程复习、考研专业课冲刺以及期末自测等多种场景。压缩包内为1个PDF文件,整体约1.7MB,单文件携带方便,可打印或电子阅读。目前已有142人浏览学习,是同类备考资料中具参考价值的练习材料。题库共含9套题,题型包括选择题、填空题和简单应用题,覆盖数据独立性、外/内/存储模式区分、关系代数选择投影连接、group by与having、%通配符、BCNF判定、E-R图与数据流图转换、事务持久性、授权、视图存储等高频知识点;简单应用题还提供具体关系表示例,要求写出关系代数表达式,能有效训练解题思路,帮助考生查漏补缺,巩固数据库理论基础。无论是用于知识框架梳理还是考前突击,这套题库都能提供有效支撑。

1. 数据库考研九套题:这份PDF真正值钱的是后面的大题

考研数据库,说到底考的是三件事:会不会写关系代数、能不能写对SQL、能不能判断范式。这份《考研数据库9套题.pdf》就是把这三件事翻来覆去练了九遍的题集——每套卷子的结构几乎一致:20道选择题、10道填空题、15分关系代数计算、25分SQL应用题,再加一道15分的E-R图或规范化综合题。选择题覆盖三级模式、函数依赖、并发控制、事务特性这些数据库原理的核心知识点,但真正拉开差距的是后面的大题。适合三类人:正在准备数据库考研专业课的同学、想给数据库课程设计找题源的老师,以及准备数据库面试题、想快速过一遍核心概念的从业者——这套题库里的除运算、无损连接判定、两段锁协议,面试被问到的概率极高。

2. 九套题考点拆解:题型分值、重复考点与刷题顺序

2.1 每套卷的固定模块:分数结构决定复习重心

九套题的版式基本统一,以第一套为例,分数结构如下:

题型题量分值考察方向
选择题20题20分概念辨析、SQL细节、范式判断
填空题10题10分术语记忆、锁协议、故障类型
简单应用题5题15分关系代数计算(交、差、除、笛卡尔积)
应用题5题25分SQL建表、查询、视图、授权
综合题2题30分函数依赖与规范化、E-R图转关系模型

第三套略有不同,把关系代数题换成了20分的简答题,考察点是“最小函数依赖集满足的三个条件”“并发操作会带来哪些问题”“局部E-R模型合并的冲突类型”。这种变化说明出题人会在同一知识域内切换考察形式——概念题和计算题轮流上,背下来的东西不一定能用,练过的运算也不一定写得出来。

所以刷这套题不能只对答案,要按题型拆开训练。选择题和填空题是用来查漏的,关系代数和SQL应用题是用来练手速的,最后两道综合题是用来建立整体解题框架的。

2.2 高频考点地图:这些知识点在九套里反复出现

把这九套题过一遍,会发现考点高度集中,翻来覆去就是下面这些:

三级模式与两级映像。第一套第三题问“描述数据库中全体数据的全局逻辑结构和特征的是哪个模式”,答案是D(模式)。外模式是局部逻辑结构,内模式是物理存储结构,模式是全局逻辑结构——这三个概念几乎每套卷的选择题都会出现,换着角度问。

关系运算。选择、投影、连接是关系系统最小应具备的运算(第一套第四题);花费时间最长的运算是笛卡尔积(第二套第四题);自然连接要求两个关系有公共属性(第三套第十题)。这些题都在考同一个底层认知:关系代数是过程化语言,每一步算出来的还是关系。

函数依赖与范式。第一套第五题考“分解保持函数依赖最高能达到几范式”,答案是BCNF。全码组成的关系模式最高也是BCNF(第一套第十七题)。这部分是压轴大题的常客,几乎每套的第五题或第六题都是给一个函数依赖集,让你求最小依赖集、候选码、判定范式、做无损分解。

并发控制与事务。事务的ACID四个性质分别对应一套题里的不同选择题;两段锁协议是可串行化调度的充分条件(填空题第5题);死锁属于事务故障(第三套第十二题)。数据库并发锁、数据库死锁这些概念,在这套题库里是全套覆盖的。

安全性与完整性。授权、视图、日志、加密、转储这些词频繁出现在填空和选择题里。视图建好后数据字典里存放的是视图的定义而不是数据(第一套第十六题),这是最容易被当成“物化视图”记错的知识点。

数据库设计流程。需求分析、概念设计(E-R图)、逻辑设计(关系模式)、物理设计,每个阶段干什么,选择题和简答题都会考。E-R图合并时的属性冲突、命名冲突、结构冲突(第三套简答题第4题),也是固定考点。

数据库同步与恢复。日志文件的主要内容是对数据的全部更新操作(第一套第二十题),数据转储是制作后援副本的过程(第二套填空题第7题),系统故障和介质故障要区分——系统故障是内存数据丢失,介质故障是硬盘数据丢失,恢复策略完全不同。

2.3 按时间分配刷题顺序:先摸底、再拆练、后限时

这套题的合理用法不是按顺序从头做到尾,而是分三轮。

第一轮用第1、2套做摸底。不看书、不限时,完整做一遍,把错题按“概念不清”和“计算失误”分类。摸底的目的不是得分,是找出知识盲区集中在哪一章。比如选择题错得多的集中在范式判定,那后面重点练第四章的内容。

第二轮用第3到第6套做分题型训练。每天只练一种题型:今天只做所有套卷里的关系代数题,明天只写SQL应用题。这样做的好处是能在短时间内形成对同一类题型的肌肉记忆。SQL题尤其值得反复写——CREATE TABLE、UPDATE、嵌套查询、视图授权这四类题在九套卷里出现了至少二十次,写多了自然就顺了。

第三轮用第7到第9套做限时综合。按考研专业课的150分钟标准给自己限时,写完再对答案。这一轮的重点是时间分配,我一般建议选择题不超过15分钟、填空题不超过10分钟,把时间留给后面的关系代数和规范化大题——那才是真正决定分数的地方。

3. 关系代数与SQL应用题:可以照抄的解题模板

3.1 关系代数:交差、笛卡尔积和除运算的手算路径

关系代数题在九套卷里占了整整15分,但题型非常固定。以第一套第三题为例,给了三个表R、S、T,要求算五个表达式。

先看最简单的交和差。R∩S就是找两个表中完全相同的行。R表有四行,S表有五行,逐行比对,只有a1 b1 c2和a3 b4 c6在两个表里都出现,所以交运算的结果就是这两行。R-S则是找R里有但S里没有的行:a2 b3 c7和a1 b2 c3。

这里有个常见翻车点:交和差要求两个关系是相容的,也就是属性个数相同且对应属性域一致。做题时先确认这一点再动手,不要看到表就直接写答案。

再看笛卡尔积 R×T。R有4行3列,T有3行3列,结果一定是12行6列。做法是R的每一行依次拼接T的每一行。为了区分同名的B、C列,结果里要写成R.B、R.C、T.B、T.C,这就是为什么答案里出现了六列而不是三列。动手算的时候,我习惯先把R的第一行跟T的三行分别拼好,再换第二行,这样不容易漏。

最后一题∏A,DσS.B=T.B(S×T)考的是运算顺序:先做S×T,再选择S.B=T.B的行,最后投影A和D列。这类题的关键是记住运算符优先级——选择σ的角标里写的是条件,投影∏的角标里写的是要保留的列,从内往外读。

最考验理解的是除运算。第一套的(R∪S)÷T,很多人一上来就错在没看到括号里的并集。除运算的逻辑是:被除关系中那些在除关系所含属性上的取值,能够覆盖除关系中所有取值组合的行。具体到这个题:

T 的 (B,C) 组合为:(b1,c2)、(b2,c1)、(b2,c3) R∪S 按 A 分组: A=a1: (b1,c2)、(b2,c3)、(b2,c1)、(b2,c3) → 三个组合全覆盖,保留 A=a2: (b3,c7)、(b2,c3) → 缺 (b1,c2) 和 (b2,c1),剔除 A=a3: (b4,c6) → 只有一组,剔除 A=a4: (b6,c6) → 剔除 结果:A 列只有 a1

我一般这样跟学生对答案:除运算的商是一个只包含被除关系中除关系没有的那些属性的关系。(R∪S)÷T的除关系T有(B,C,D)三列,被除关系R∪S有(A,B,C)三列,相减得到(A),所以结果只含A列——列不会错,剩下的就是核对每个值是否全覆盖。

3.2 SQL建表和增删改查:一套SQL模板吃透二十五分

第一套第四题给了完整的学生选课库结构:S(Sno,Sname,Sage,Ssex,Sdept)、C(Cno,Cname,Teacher,Ccredit)、SC(Sno,Cno,Grade)。这五道小题基本覆盖了SQL应用题的常见场景。

第1小题建表,答案是标准的CREATE TABLE:

CREATE TABLE SC ( Sno CHAR(10) NOT NULL, Cno CHAR(10) NOT NULL, Grade INT CHECK (Grade >= 0 AND Grade <= 100), PRIMARY KEY (Sno, Cno), FOREIGN KEY (Sno) REFERENCES S(Sno), FOREIGN KEY (Cno) REFERENCES C(Cno) );

这段代码有三处值得注意。PRIMARY KEY (Sno, Cno)表示联合主键,两个字段一起唯一标识一行;FOREIGN KEY ... REFERENCES ...是外键约束,保证Sno必须在S表里存在;CHECK约束限定了Grade的取值范围。注意原答案里写了Grade =< 100,这是笔误,标准写法是<=,考试时写错了要扣分。

第2小题是把计算机科学系全体学生成绩置零:

UPDATE SC SET Grade = 0 WHERE 'CS' = ( SELECT Sdept FROM S WHERE S.Sno = SC.Sno );

这里用的是相关子查询——内层查询引用了外层SC表中的Sno,对SC的每一行都会执行一次子查询。等价写法是用WHERE Sno IN (SELECT Sno FROM S WHERE Sdept = 'CS')。两种写法都行,但如果SC表很大,相关子查询性能要差一些,实际工作中我更常用IN子查询或JOIN。

第3小题查“平均及格课程数大于等于3门的学生的学号和姓名”,考的是GROUP BY和HAVING的配合:

SELECT Sno, Sname FROM S WHERE Sno IN ( SELECT Sno FROM SC WHERE Grade >= 60 GROUP BY Sno HAVING COUNT(*) >= 3 );

GROUP BY Sno 把选课记录按学生分组,然后HAVING对组做筛选。注意WHERE是先于GROUP BY执行的,所以“及格”这个条件放在内层WHERE里,而“组内记录数大于等于3”这个组级条件只能放在HAVING里,顺序不能颠倒。

第4小题创建视图并授权:

CREATE VIEW VSC (Sno, Sname, Cno, Cname, Grade) AS SELECT S.Sno, Sname, C.Cno, Cname, Grade FROM S, C, SC WHERE S.Sno = SC.Sno AND C.Cno = SC.Cno; GRANT UPDATE ON TABLE S TO U1 WITH GRANT OPTION;

视图VSC把三张表连接后的结果封装成一个虚表,用户查询它时不需要关心底层三表连接细节。WITH GRANT OPTION表示U1不仅自己能更新S表,还能把更新权限再授予其他人——这是授权传播的标志,题目里“U1可以将权限进行传播”对应的就是这个子句。去掉它U1就只有使用权没有转授权。

3.3 第二套的视图授权变体:用视图隔离敏感数据

第二套第四题有一个更灵活的考法:用户U1要查每门课的最高分、最低分和平均分,但不能看每个学生的个人成绩。解法是先建分组统计视图,再授权:

CREATE VIEW 课程成绩 AS SELECT Cno, MAX(Grade), MIN(Grade), AVG(Grade) FROM SC GROUP BY Cno; GRANT SELECT ON 课程成绩 TO U1;

这道题的思路是“把能看的数据封装进视图,把不能看的数据留在基表里”。U1对SC表没有任何权限,只能通过课程成绩视图间接访问聚合后的数据。这种用视图做行级和列级安全隔离的思路,在真实系统里也常见——只给报表用户开聚合视图,不暴露明细表。第三套第五题再进一步,要求建一个按A分组后求C和E平均值的视图RST,本质是同一个模式:多表连接 + GROUP BY + 平均值聚合。

4. 候选码、函数依赖与范式判定:规范化题型的三板斧

4.1 候选码求解:先用L/R/LR分类缩小范围

规范化大题每次都是压轴,但套路非常固定。第二套五题是最典型的例子:R(A,B,C,D,E),F={A→C, C→D, B→C, DE→C, CE→A}。

求候选码的第一步是给所有属性分类。只出现在函数依赖左边、从不出现在右边的属性叫L类,它们必定包含在候选码里;只出现在右边的叫R类,它们不可能出现在候选码里;两边都出现的叫LR类,需要逐个试探。

这个题里,B和E只出现在左边,是L类,所以任何候选码都必须包含BE。第二步是求BE的属性闭包。B→C推出C,C→D推出D,现在有了B、C、D、E,CE→A推出A——所以BE的闭包是全体属性U,BE就是唯一候选码。第三套第四题也是同样套路,U={A,B,C,D,E},最后推出CE是候选码。

4.2 最小函数依赖集:三步走,每一步都有对应的判断标准

最小函数依赖集是另一道必出题。第一套五题给了一个较复杂的依赖集:F={BE→G, BD→G, CD→A, CE→G, CDE→AB, BC→A, B→D},答案的Fmin是{B→G, CD→A, CE→G, B→D, CDE→B}。

标准做法分三步。

第一步,右部单属性化。把CDE→AB拆成CDE→A和CDE→B两条。

第二步,删除冗余依赖。逐个检查每条依赖能否由剩下的依赖推出。BE→G是冗余的,因为B→D、BD→G可以推出它;CDE→A是冗余的,因为CD→A直接给出A;BC→A也是冗余的,因为B→D得到D,CD→A就给出了A。

第三步,消除左侧冗余属性。BD→G左侧的D是冗余的,因为B→D,从B能推出BD,所以BD→G实际上等价于B→G,直接收缩。

这三步做完,得到的就是答案里的集合。第二步最常出错,因为判断“某条依赖能否由其余依赖推出”需要求闭包——比如要判断BE→G是否冗余,就看在去掉它之后的F里,BE的闭包是否还包含G。B→D、BD→G都在,所以BE的闭包包含G,这条依赖可以安全删除。判断顺序也是经验之谈:我习惯先处理右部单属性,再从左到右逐条检查依赖,最后处理左侧冗余属性,顺序反了容易越删越乱。

4.3 无损连接判定:表格法的一行一列都不能填错

无损连接分解判定是必考步骤。第二套五题给了一个分解ρ={AD, AB, BC, CDE, AE},答案判定为有损。表格法要这样走。

构造一张五行五列的判定表,行对应分解后的关系模式,列对应U中的属性。初始时,如果某行对应的关系模式包含该属性,就在对应位置填a加属性下标(比如A列填a1);否则填b加行号列号(比如AD行的C列填b13)。

然后扫描函数依赖集,把满足“左部属性取值相同”的行,其右部属性改为一致。以A→C为例,AD和AB两行的A列都是a1,左部相同,把两行的C列改成同一个值。C→D同理,把AB行的D列改成a4——因为AD行已经有a4(D是AD的属性)。

完整走完一遍之后,判断标准只有一个:是否存在某一行全部是a。有就是无损,没有就是有损。这个分解最终没有任何一行是全a,所以是有损连接分解。这里最容易翻车的是初始表构造:行一定是分解的关系模式,列一定是全集U的属性,很多人把行列写反导致后面全错。另外每轮扫描结束后要反复检查是否有新的行间同步可以触发,直到表格不再变化才能下结论。

4.4 BCNF无损分解和3NF保持依赖分解:两种分解的边界条件

2NF、3NF、BCNF的层次关系在这套题里反复考。第一套的第十八题那句“关系模式分解为BCNF后,函数依赖关系可能被破坏”是整张卷子里最容易被忽视的判断——BCNF分解保证无损但不保证依赖保持,3NF分解保证依赖保持,这是两个不同的目标。

第二套五题要求无损分解到BCNF,答案是ρ={AC, BD, ABE}。思路是:找出违反BCNF的依赖A→C,把A和C拆出来,剩下的部分继续检查。A→C单独成表AC;剩余属性B、D、E中,B→C已经被拆掉,剩下B→D违反BCNF,再拆出BD;剩下ABE满足BCNF。这个分解是无损的,但因为丢掉了CE→A和DE→C,它不保持函数依赖。

而第一套五题要求的“分解为3NF,保持函数依赖和无损连接性”则是另一套做法:把最小函数依赖集里的每个依赖单独成表,然后加上候选码。Fmin是{B→G, CD→A, CE→G, B→D, CDE→B},每个依赖生成一个关系模式:BDG、ACD、CEG、BD、CDEB。合并左部相同的BDG和BD,得到BDG;加上候选码BCE或CDE所在的CDEB,最终就是ρ={BDG, ACD, CEG, BCDE}。答案里的BCDE同时包含了候选码CE,所以无损和依赖保持两个条件都满足。

这里要记牢一个边界:BCNF分解用“逐个拆违反范式”的算法,目标是消除所有非平凡且非超码的函数依赖,代价是可能丢依赖;3NF分解用“依赖先成表再加候选码”的合成法,目标是保住全部函数依赖。两者各有适用场景,考试时看清楚题目要的是哪一个再动手。

4.5 E-R图转关系模型:一个M:N联系就要多一张表

这类题在这套题库里也占了不少分值,最典型的是第二套六题的图书馆数据库和第三套六题的医院管理系统。

图书馆库的实体有读者(读者号、姓名、地址、性别、年龄、单位)和书(书号、书名、作者、出版社),联系是“借阅”,一个读者可借多本书,一本书可被多个读者借,是M:N联系。转关系模型时,两个实体各成一张表,M:N联系单独建一张表,主键由两端的实体主键组合而成,再加上联系本身的属性。所以答案是:

读者(读者号,姓名,地址,性别,年龄,单位) 书(书号,书名,作者,出版社,读者号,借出日期,应还日期)

注意书表里也放进了读者号和借阅日期,这是因为“书被借出”这件事情是借阅联系在书这一侧的体现。如果借阅属性里还有借阅流水号,就更规范的做法是借阅(读者号,书号,借出日期,应还日期)单独成表。第一套六题的汽车运输公司题也是这个套路——车队和司机是1:N聘用联系,车队和车辆是1:N拥有联系,司机和车辆是M:N使用联系,最后“使用”单独成表。

范式判断上,这些分解后的关系模式基本都是BCNF,因为单属性主键的表不存在部分依赖,而联合主键的表只要没有属性只依赖于主键的一部分,也满足BCNF。

5. 数据库备考避坑指南:九套卷里反复踩的五个翻车点

5.1 GROUP BY的“陷阱题”:教材口径和SQL标准不是一回事

第一套第五题“使用GROUP BY Sno时,Sno必须出现在哪个子句中”,答案是C(select)。很多学生实际跑过数据库后会质疑:我在MySQL里写SELECT Cno, AVG(Grade) FROM SC GROUP BY Sno明明也能跑?原因是不同数据库实现不一样。MySQL默认关闭了ONLY_FULL_GROUP_BY时确实能跑,但开启后会直接报错;PostgreSQL则一直严格遵守标准。考研教材的表述是“被分组的列必须出现在SELECT中”,这是国内数据库教材的惯用口径。备考时按教材答,写真实项目时按SQL标准和ONLY_FULL_GROUP_BY模式调。现象的根源是教材与实现的表述差异,解决方法是遇到这类题先确认题目来自哪个体系——考研真题按教材口径答,实际开发按标准来。

5.2 除运算对象看错:括号里的并集被忽略

第一套第三题的(R∪S)÷T,一眼扫过去容易看成R÷T,直接拿原表R做除法,算出个完全不沾边的结果。除运算的被除关系必须先算括号里的R∪S,合并R和S的全部行,再去跟T比对。现象是算出多个A值,答案只有唯一的a1;原因是漏看了括号,把复合表达式拆错;解决方法是动手前先圈出括号范围,明确被除关系的完整集合。这一丢就是3分,整套题里类似的括号陷阱还有∏A,DσS.B=T.B(S×T)里的选择条件,别把笛卡尔积的结果写成两个表平铺。

5.3 无损连接判定表的初始构造:行和列填反,后面全盘错

表格法判定无损连接,第一步就把行列搞反的人不在少数。现象是填出来的表和答案差很远,扫描函数依赖时根本找不到可以同步的行;原因是把“分解的关系模式当列、全体属性当行”,正好反了;解决方法是记住口诀“行是分解结果,列是全集属性”——某个分解关系Ri包含属性Aj,就在i行j列填a_j,不包含的填b_ij。另外初始表填完后要先把表抄一遍再开始扫描依赖,很多人在扫描过程中把初始值改乱了又没法回溯。

5.4 视图的更新权限被高估:分组视图根本不能更新

第二套四题创建了包含MAX、MIN、AVG的分组视图课程成绩,用户U1被授予了SELECT权限。很多学生做完这题会顺手往视图里INSERT或UPDATE,试图“通过视图改底层数据”,结果报错。现象是视图查询正常但更新报“视图不可更新”;原因是分组聚合视图不是行列子集视图,DBMS无法把视图行映射回基表的唯一一行,所以不允许增删改;解决方法是牢记“可更新视图必须是来自单表、包含主键、未使用聚合和DISTINCT的行列子集视图”。这和第一套十六题“视图运行后数据字典里存的是视图的定义”是同一个考点的两面——视图本质是把查询语句存起来,不是把数据复制一份。

5.5 系统故障和介质故障混为一谈:恢复策略完全不一样

填空题第9题问“造成系统停止运转、需要重新启动的事件”,答案是系统故障。但很多人会写成介质故障。这两个概念在第二套选择题第18题里被明确区分过:系统故障造成内存数据丢失,介质故障才是硬盘数据丢失。现象是两个填空答案写反;原因是用“严重程度”而不是“丢失对象”来区分故障类型;解决方法是按恢复策略记忆——系统故障用重做+撤销恢复,介质故障需要先转储后援副本再配合日志文件把数据库恢复到故障点。数据库同步、恢复日志的考点都集中在这个知识点上,别只看概念表面。

6. 考前复盘:把九套答案变成一张考点命中表

最后一轮复习,不适合再整章整章刷题,而是要把九套题的答案反推成一张“考点命中表”。做法是准备一张A4纸,横轴列章节(三级模式、关系运算、SQL、规范化、并发控制、安全恢复、数据库设计),纵轴写套数1到9,每做对一套就往对应位置画一笔。做完之后,这张纸会直接告诉你哪个格子最密——密集的地方是必考点,空白和稀疏的地方要么是冷门知识要么是你回避了很久的弱项。

我习惯配合三色标记:红色标“概念理解错”(比如把系统故障和介质故障搞混),黄色标“计算失误”(除运算少算一行、无损连接表填错),蓝色标“教材口径有争议”(比如GROUP BY那个题)。这九套题做下来,整理出的红色和蓝色条目通常不超过十条,考前最后一天只看这两类就够。黄色条目属于手误,到了考场上减速重算一遍就行,不值得占用短期记忆。

标记的时候留意跨套重复出现的题目模式。第一套和第二套都考了(R∪S)÷T和分组H AVING计数,第三套和第五套都要求设计E-R图并判断范式等级——这些地方是出题人的舒适区,命中率最高。考前花半小时把三套卷的规范化大题放在一起横向对比,你会发现最小函数依赖集的三步走、无损连接表、3NF合成法翻来覆去就那几个动作,真正需要临时想的只有E-R图里实体间是1:N还是M:N。

这套PDF的扫描质量一般,部分题目文字被OCR断成了单字,但题目内容完整,答案列在每套卷末尾,做题时留意一下表述即可。从那以后,我每次考前都会强制花最后半小时做一遍这张命中表,把错题浓缩到一张纸上再进考场——这半小时换来的安心感,比多刷三套题都值。希望帮到你。

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

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

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

立即咨询