简介:《数据库系统概论》期末复习试题及答案,面向计算机相关专业本专科学生、期末备考者及考研基础复习人群。这份PDF完整收录一套数据库系统概论期末试卷,含20道单选题、填空题、简答题及数据库设计题,覆盖数据库管理系统与三级模式、数据独立性、E-R模型转换、关系代数与外连接、主码与唯一索引、函数依赖与范式、视图作用、事务隔离性、日志恢复、S锁/X锁、两段锁协议及死锁等核心考点,题目类型与常见期末考法高度契合,且每道题均配有标准答案,便于考前自测、逐题对照和查漏补缺。资源包共1个PDF文件,大小约421KB,内容精炼,适合打印或移动端随时翻阅。已有288人学习下载,可作为数据库系统概论课程期末复习的实用参考资料。
1. 数据库系统概论期末试卷:这份 PDF 到底值不值得花时间刷
先说结论:如果你正在备考《数据库系统概论》期末考,或者在找工作前想快速捡起关系数据库的核心概念,这份试卷 PDF 是少见的「一套题覆盖整本书」的资料。它不像很多网上流传的题库那样只有选择题或者只有简答题,而是完整的一套卷子——20 道单选、9 道填空、3 道简答、5 道设计题、1 道综合题,而且每道题都带参考答案和评分标准。我拆完这套题的感觉是:它实际上把三级模式、关系代数、SQL 设计、范式分解、事务并发控制这些数据库系统概论的必修考点全部串了一遍,连 E-R 图转关系模型的细节都没放过。
这套题适合两类人。一类是考前想自测的在校生,按两个小时限时做一遍,再对答案,基本能定位自己哪块知识是黑匣子;另一类是像我们这样工作几年后想复习数据库基础的人,不需要从头翻教材,直接拿这套题当索引,看到哪个题卡住了,再回去翻那一章。下面我按试卷的结构拆开讲,哪些题是送分题、哪些题藏着坑、设计题的标准写法是什么样。
2. 选择题背后的考点地图:三级模式、关系代数与锁机制
2.1 三级模式与两级映象:四道题其实在考同一张图
试卷选择题第 4、5、16、20 题看起来分散,实际上都在考同一个东西:数据库三级模式结构和两级映象。第 4 题问物理独立性,正确答案是「用户的应用程序与存储在磁盘上数据库中的数据是相互独立的」,这句话的关键在于物理独立性指的是内模式改变时应用程序不用改,改的是模式与内模式之间的映象。第 5 题问逻辑数据独立性要修改什么,答案是「模式与外模式之间的映象」——外模式不变,模式变了,只要调整映象就能让应用程序感知不到变化。
这两题是典型的「背了就会、不背就懵」的题,但很多人会搞混。我的记忆技巧是:逻辑独立性靠外层映象撑,物理独立性靠内层映象撑。你可以想象成三层楼,模式和内模式之间是地基和楼层的关系,外模式和模式之间是用户视角和实际表结构的关系。改地基不动楼层,改楼层不动用户看到的窗户,这就是两级映象存在的意义。
第 16 题考事务隔离性,原话是「一个事务内部的操作及使用的数据对并发的其他事务是隔离的」。很多人会把隔离性和持久性混淆,其实隔离性对应的是并发控制中的锁和隔离级别,而持久性对应的是日志和恢复机制。第 20 题考两段锁协议,选项 D 是「Slock A …Unlock A ……Slock B …Xlock C」,这个顺序违反了「先封锁后释放、所有封锁在释放之前」的两段锁原则——两段锁要求任何事务的加锁段必须在解锁段之前,一旦开始解锁就不能再加锁。
2.2 关系代数与外连接:第 8、9 题的等价变换逻辑
第 8 题问 R∩S 等价于什么,答案是 S-(S-R)。这题考的是关系代数的基本等价变换,很多人会用集合论的直觉去推,但关系代数的减法和集合减法一致,S-(S-R) 的语义是:先算出 S 中不在 R 里的部分,再用 S 减去这部分,剩下的就是 S 和 R 的交集。这题不难,但和后面 SQL 中的 NOT EXISTS 写法有直接关联——你会发现 NOT EXISTS 双嵌套本质上就是在做这种集合差运算。
第 9 题是学生和宿舍的左外连接问题。题目说有的学生不住宿、床位可能空闲,要列出所有住宿情况和空闲床位,答案是左外连接。这里的坑在于:全外连接会同时保留没有学生的床位和没有床位的学生,但题目只要求列出"住宿和宿舍分配的情况",没有学生的宿舍算空闲床位吗?不算,因为学生关系在左边,要以学生表为保留端。判断用左连接还是右连接的标准很简单:谁的信息不能丢,谁就是保留端。
2.3 SQL 建表与授权:第 10、11 题的语法细节
第 10 题给了建表语句,问哪个元组能插入。表结构是 Sno CHAR(4) 主键、Sname CHAR(8) NOT NULL、Sex 和 Age 允许为空。正确答案是 D:'5021','刘祥',NULL,NULL。这题的坑在选项 C——Sname 是 NOT NULL,传 NULL 会被拒绝;选项 B 的主键是 NULL,直接违反实体完整性;选项 A 的男没有加引号,SQL 里字符串必须用单引号包裹。看起来是语法题,实际上考的是主键非空加 NOT NULL 约束的综合判定。
第 11 题考 GRANT 授权语句的语法,正确答案是GRANT UPDATE(QTY) ON SPJ TO 李勇。两个易错点:列名要写在 UPDATE 后面的括号里,用户名前不能加引号——这是很多教材的写法差异,SQL Server 的 T-SQL 里用户标识符不加引号,加了反而当成字符串字面量。
3. 填空与简答:把散碎知识点焊成答题框架
3.1 填空题的九个采分点:从完整性约束到死锁
填空题第一题问关系数据模型由关系数据结构、关系操作和什么组成,答案是关系完整性约束。这题如果丢分,说明教材第一章的整体框架没建立起来——关系模型的三要素是结构、操作、完整性约束,它们是并列关系,不是包含关系。第二题问自然连接的前提,答案是共有的属性,这属于送分题。
第三题是个考点密集的地方:在 Sname 列上建立唯一索引,答案是CREATE UNIQUE INDEX 索引名 ON student(Sname)。注意题目原文写的是 CREATE 后面缺了 UNIQUE,而参考答案里补全了。这个细节提醒我们:唯一索引和普通索引的区别必须靠 UNIQUE 关键字体现。我在工作中确实遇到过这种问题,业务上要求手机号唯一,结果开发建了普通索引,数据照样录入了重号,后来靠排查才发现索引语义错了。
第四题问!=ALL等价于什么运算符,答案是 NOT IN。这在面试里也常考,!=ALL是「不等于所有」,NOT IN 也是「不在集合中」,两者语义等价。但要注意 NULL 的坑:如果子查询结果里包含 NULL,NOT IN 的查询会返回空结果集,因为 NULL 参与比较的结果是 UNKNOWN。这个问题在后面的避坑章节我会重点讲。
第五题给函数依赖求候选码,R(A,B,C,D),F={A→B,A→C,A→D,(B,C)→A},候选码是 A 和(B,C),R 属于 BCNF。这题比设计题里的分解简单,但原理一样:候选码的判断要看哪些属性不落在任何函数依赖的右边,A 和 B、C 的组合都能推导出全部属性。第六题填 E-R 图冲突类型,答案是命名冲突,三种冲突是属性冲突、命名冲突、结构冲突,这题背下来即可。
第七、八、九题分别是事务是 DBMS 的基本单位、死锁的定义、可串行性是并发事务正确性的准则。这三题属于数据库系统概论的核心术语,考的就是你知不知道事务的定义和并发控制的终极目标。可串行性这个概念特别重要,它意味着并发执行的调度结果等于某个串行调度的结果,这是判断并发正确性的黄金标准。
3.2 简答题的标准答法:参照完整性、视图作用与日志原则
简答题三道题的参考答案值得仔细品。第一题问参照完整性规则,参考答案说的是:若属性 F 是基本关系 R 的外码,它与基本关系 S 的主码 Ks 相对应,则 R 中每个元组在 F 上的值必须取空值或等于 S 中某个元组的主码值。注意采分点:指明 F 是外码、与 S 的主码对应、取空值或等于主码值——三句话各一分,少一句都要扣分。这告诉我一个备考经验:简答题别写长句,把采分点拆成独立的短句,阅卷老师扫一眼就能给分。
第二题问视图的作用,参考答案列了四条:简化用户操作、多角度看待同一数据、对重构数据库提供一定程度的逻辑独立性、对机密数据提供安全保护。这四条里最容易被忽略的是「逻辑独立性」——当数据库重构时,通过视图层可以屏蔽底层表结构变化对应用程序的影响,这和选择题第 5 题是同一个知识点的不同考法。
第三题问登记日志文件必须遵循的原则,有两层:一是登记次序严格按并发事务执行的时间次序,二是必须先写日志文件、后写数据库。第二层特别关键,这对应的是数据库恢复里的 Write-Ahead Logging 策略——如果先写数据库再写日志,数据库崩溃时日志里缺失了本次修改,恢复过程就无法还原,导致数据不一致。我当时复习到这里专门去翻了教材的恢复章节,把日志和后备副本的区别彻底搞清才放心。
4. 设计题实战:从 SQL 写出到范式分解的完整推演
4.1 把 SQL 查询翻译成汉语和关系代数:第 1 题的两种答案
设计题第一大题给了一个教学库的场景,有三个表 S、C、SC,SQL 语句问的是「张三同学没有选修的课程的课程号」,要求用汉语阐述含义,并写成等价的关系代数。汉语翻译不说了,关键是关系代数的写法:
πCNO(C) - πCNO(σSNAME='张三'(S) ⋈ SC)这个表达式的逻辑是:先查出张三选修过的课程号,在 C 表里求出所有课程号,两者做差,剩下的就是没选修的。这里注意一个细节:σSNAME='张三'(S) 和 SC 做自然连接会先过滤出张三的选课记录,再投影课程号。如果先做 S 和 SC 的全连接再选择,效率差很多,语义上也可能出错。评分标准说得很清楚:两个关系的差 1 分,σ 选择和连接 1 分,任意一个错误不给分。
等价的关系代数还有一个写法 πCNO(C) - πCNO(σSNAME='张三'(S ⋈ SC)),这个也允许。两种写法本质上都是「全集减去子集」,和选择题第 8 题的 S-(S-R) 是同一个思想。我在实际写查询时经常用这个套路:要查「不在某个集合里的数据」,优先想 NOT IN 或差运算,但要警惕 NOT IN 遇到 NULL 的坑,后文专门讲。
4.2 UPDATE、CREATE VIEW 和双层 NOT EXISTS:三个典型 SQL 场景
第二、三、四题分别考 UPDATE、CREATE VIEW 和 NOT EXISTS 双重否定查询。先看 UPDATE 加薪题:
UPDATE EMP SET SALARY = SALARY + 200 WHERE SALARY < 1000 AND SEX = '女';这题有三个得分点:UPDATE EMP 表名正确、SET 子句里的加薪表达式正确、WHERE 里的两个条件都齐全。参考答案特别注明:少 SET 不给分,条件少任何一个不得分,把 1000 写成 '1000' 也不得分——因为 SALARY 是数值型,写成字符串会触发隐式转换,虽然有些数据库会宽容处理,但严格评分时算错。这个「数值不写引号」的细节,在工作中写 SQL 也要养成习惯。
再看视图题:
CREATE VIEW VIEW6 AS SELECT ENO, ENAME FROM EMP WHERE SEX = '女' AND ENO IN ( SELECT MGR_ENO FROM DEPT );这个视图查的是女车间主任的职工号和姓名。参考答案给了第二种写法——用 DEPT 和 EMP 做连接:
CREATE VIEW VIEW6 AS SELECT ENO, ENAME FROM DEPT, EMP WHERE MGR_ENO = ENO AND SEX = '女';两种写法都可得满分。注意评分标准里强调「少 VIEW 或将 VIEW6 写成其它名称不给分」,这是提醒你视图的关键字是 CREATE VIEW,不是 CREATE TABLE。视图本质上是虚拟表,但创建语法必须用 VIEW,我在面试别人时也常拿这个点考察基础牢固程度。
第二题的子查询比较难,要求找出至少供应了代号为 '256' 的商店所供应的全部商品的其它商店。经典的解法是双重 NOT EXISTS——先找出 256 商店供应的全部商品集合,再查其它商店中不存在「某个 256 供应的商品而该商店没供应」的情况:
SELECT ANAME, CITY FROM A WHERE NOT EXISTS ( SELECT * FROM B WHERE EXISTS ( SELECT * FROM AB AB1 WHERE A# = '256' AND B# = B.B# ) AND NOT EXISTS ( SELECT * FROM AB AB2 WHERE A# != '256' AND A# = A.A# AND B# = B.B# ) );这段 SQL 是整套卷子里最考验逻辑的语句。内层的 EXISTS 限定 B 是 256 商店供应的商品,第二个 NOT EXISTS 检查当前商店 A 是否缺了某个商品,如果缺了就说明不是「至少供应了全部商品」。外层 NOT EXISTS 再取反,找出不缺任何这些商品的其它商店。我在项目里写「找出买了全部商品品类」的客户时也用同样的双层 NOT EXISTS 结构,这个模式值得反复手写直到熟练。
4.3 五步 BCNF 分解:从候选码到每一级范式的操作清单
设计题第五题是整卷的压轴题:R(A,B,C,D,E),F = { ABC→DE,BC→D,D→E },要求求候选码、判断范式、分解到 BCNF。参考答案我一直认为是整套卷里写得最好的部分,因为它把分解过程按步骤拆开了。
第一步求候选码。观察函数依赖右边出现的属性:D 和 E 都出现在右边,左边有 A、B、C。由 BC→D,D→E,可知 BC 能推出 D、E,加上 ABC→DE,可以推导出 A、B、C 能推出所有属性。进一步看,A 不出现在任何依赖的右边,必须包含在候选码里,而 ABC 的闭包是全部属性,所以候选码是(A,B,C)。
第二步判断范式。因为存在非主属性 D 对候选码的部分函数依赖——D 可以由 BC 单独推出,而 BC 是候选码的真子集——所以 R 属于 1NF,不是 2NF。这一步的判据要背熟:主属性是候选码包含的属性,非主属性对候选码的部分函数依赖导致 1NF 到 2NF 的差距。
第三步开始分解。首先消除部分函数依赖,把 R 分成 R1(A,B,C) 和 R2(B,C,D,E)。R1 中(A,B,C)是候选码,没有非平凡函数依赖;R2 中还保留着(B,C)→D 和 D→E 两个依赖,其中 E 通过 D 传递依赖于(B,C),所以 R2 是 2NF,不是 3NF。
第四步消除 R2 中的传递依赖,把 R2 分解成 R21(B,C,D) 和 R22(D,E)。R21 的候选码是(B,C),唯一依赖是(B,C)→D,决定因素是候选码;R22 的候选码是 D,唯一依赖 D→E,决定因素也是候选码。
第五步检查 BCNF。这三个关系模式中所有函数依赖的决定因素都是候选码,所以都是 BCNF。判断 BCNF 的标准就一句话:每个非平凡函数依赖 X→Y,X 必须是超码。这比 3NF 的「非主属性对码没有传递依赖」更严格——3NF 允许决定因素不是码但被依赖属性是主属性,BCNF 彻底不允许任何属性被非码属性决定。
我整理成一张表方便对照:
| 关系模式 | 候选码 | 函数依赖 | 范式级别 | 消除的依赖类型 |
|---|---|---|---|---|
| R(A,B,C,D,E) | (A,B,C) | ABC→DE, BC→D, D→E | 1NF | 非主属性对码的部分依赖 |
| R1(A,B,C) | (A,B,C) | 无平凡依赖 | BCNF | — |
| R2(B,C,D,E) | (B,C) | BC→D, D→E | 2NF | 非主属性对码的传递依赖 |
| R21(B,C,D) | (B,C) | BC→D | BCNF | — |
| R22(D,E) | D | D→E | BCNF | — |
这张表是我复习范式时常用的自查模板,每次遇到分解题都先把候选码求出来,再逐个依赖判断决定因素是否超码,最后动手拆。
5. 范式分解与 SQL 查询避坑指南:五个实测翻车现场
5.1 NOT IN 遇上 NULL:查询结果莫名为空
去年我在一个统计报表需求里写了 NOT IN 子查询,本地测试数据少,结果正常,上了生产环境后某些门店的数据对不上。排查了半天发现是子查询结果集里包含了 NULL。这里的现象是:一条简单的WHERE id NOT IN (SELECT ... FROM ...)返回空结果集,但去掉 NULL 数据后就正常。
原因是 SQL 的三值逻辑:NULL 参与 NOT IN 比较时,结果永远是 UNKNOWN,不是 TRUE,因此所有行都被过滤掉了。解决方法是改写为 NOT EXISTS,或者先对子查询结果做 IS NOT NULL 过滤。从那以后,凡是要用 NOT IN 的查询,我都会先确认子查询的字段是否有 NOT NULL 约束。这套试卷第 4 题填空考了!=ALL等价 NOT IN,就是这个知识点的信号,如果你做错了,说明三值逻辑这块是盲区。
5.2 候选码判断漏了 L 类属性:规范化方向全错
一道函数依赖题,F = { ABC→DE,BC→D,D→E },很多人第一步求候选码就出错。现象是有人写了(A,B,C,D),理由是 D 也是决定因素左边的属性;有人写(A,B),理由是 BC 和 ABC 都能推出 D。原因在于他们没有先找出「不出现在函数依赖右边的属性」——A、B、C 里只有 A 完全不出现在右边,B 和 C 出现在 ABC 和 BC 的左边,所以候选码必须包含 A、B、C。解决方法是:先找存在于函数依赖左边但绝不出现在右边的属性,这些属性必然属于候选码;再验证它们的闭包能否覆盖全部属性,不能覆盖再加属性。
5.3 视图创建少了 VIEW 关键字:语法报错还是语义错误
做设计题第四题时,有人写成CREATE VIEW6 AS SELECT ...,少了 VIEW 关键字。现象是语法检查直接报错,但有些数据库会误以为是 CREATE TABLE,导致表结构建错。原因是 SQL 语法中 CREATE VIEW 是固定搭配,不能省略。解法很简单:先在草稿纸上写完整句CREATE VIEW 视图名 AS 查询语句,再逐词对照检查。这是白送分的题,丢分实在可惜。
5.4 外连接方向选反:该保留的行被过滤掉
选择题第 9 题考外连接,实际项目里这个坑比想象中多。现象是:统计所有学生的住宿情况时用了右外连接,结果没有住宿的学生记录全部消失。原因是右外连接以右表为保留端,题目里学生表是左表,应该用左外连接。解决的方法是先确定「哪张表的信息必须全部保留」,再决定连接方向。如果两张表的记录都需要保留,才用全外连接。
5.5 INSERT 违反约束:报错信息看了但不理解
选择题第 10 题给了四种元组,正确答案只有一个。实际写代码时,违反主键或 NOT NULL 约束的 INSERT 会直接抛异常。很多初学者看到Duplicate entry或Column 'Sname' cannot be null的报错就慌了,原因是没有把表约束和报错信息对应起来。解决方法是:建表时把每个字段的约束写在注释里,INSERT 之前先检查主键是否重复、NOT NULL 字段是否有值。这套试卷的建表题就是训练这个能力的最佳素材。
6. 综合题里的 E-R 图:一张能直接套用的检查清单
综合题考的是工厂-产品-职工的 E-R 图设计,要求画实体、联系、属性,再转关系模型,标注主码外码。参考答案的评分标准特别细:三个实体各 1 分,属性漏写错写不给分;两个联系各 1 分,联系类型错误不给分。我平时画 E-R 图容易犯的毛病是只画实体和联系,忘记写联系属性,或者把 1:n 联系错误判断成 m:n。这里有一个把「规范答案」变成操作习惯的检查清单,每次画完照着过一遍基本不会丢分。
第一步检查实体。工厂有工厂编号、厂名、地址;产品有产品编号、产品名、规格;职工有职工号、姓名、聘期、工资。注意聘期和工资是职工和工厂联系的属性,因为职工在工厂工作才有了聘期和工资,所以它们在关系模式转换时落在职工关系里,而不是工厂关系里。
第二步检查联系。工厂和产品之间是 m:n 联系,语义是「每个工厂生产多种产品,每种产品可以在多个工厂生产」,联系属性是计划数量。工厂和职工之间是 1:n 联系,语义是「每名职工只能在一个工厂工作」,但注意工厂聘用职工有聘期和工资,这两个属性属于联系。
第三步检查关系模式转换。m:n 联系单独拆成一张关系表,属性包含两端实体主码加联系属性;1:n 联系把联系属性并入 n 端实体。参考答案给出四个关系模式:工厂(工厂编号,厂名,地址)、产品(产品编号,产品名,规格)、职工(职工号,姓名,工厂编号,聘期,工资)、生产(工厂编号,产品编号,计划数量)。职工表里并入的工厂编号就是外码。
第四步标注主码外码。工厂主码是工厂编号,无外码;产品主码是产品编号,无外码;职工主码职工号,外码工厂编号;生产主码是(工厂编号,产品编号),外码是工厂编号和产品编号。
这四步是我面试中级开发时必考的一道现场题,因为 E-R 图设计能力直接反映一个人对业务实体的抽象水平。我自己以前画 E-R 图也翻过车——把「计划数量」当成产品属性而不是生产联系属性,导致转关系模式时字段放错位置。后来我每次画图都先确定「这个属性是描述单个实体的,还是描述实体之间关系的」,再动手画,基本不会再犯同类错误。
这套试卷刷到最后,我最深的体会是:数据库系统概论期末考试其实是在考「你能不能把概念模型、逻辑模型、物理模型三层串起来」。选择题考概念,设计题考逻辑模型落地,综合题考最前面的概念模型设计。我建议你至少把设计题的四道 SQL 题和一道范式分解题按参考答案重新默写一遍,不要只看。默写时注意每个得分点,这才是这套 PDF 最有价值的地方——它把阅卷标准都写在答案里了,照着标准练习,考场上就不会有「觉得自己写对了但被扣分」的玄学。希望帮到你。
本文还有配套的精品资源,点击获取