简介:本资源是一份面向计算机专业本科生的《数据库系统概论》期末复习备考资料,聚焦核心概念辨析、典型题型训练与易错点解析,助力考生高效梳理知识体系、查漏补缺。内容覆盖数据库基本原理、E-R模型与关系模型转换、SQL语法与授权操作、事务特性与并发控制、规范化理论及数据库恢复机制等高频考点,题型包括20道单项选择题(含详细解析)、9道填空题及部分简答思路提示,全部题目均紧扣教学大纲与常见考试命题逻辑。资源为单个PDF文件,大小174KB,结构清晰、排版紧凑,便于打印或移动端随时查阅。已有149人学习下载,适合作为期末冲刺阶段的自测卷、知识点速记手册与标准答案参考。
1. 这不是一张卷子,而是一份数据库系统“通关地图”:20道单选+9空填空+5道简答+4道设计+1道综合,覆盖《数据库系统概论》核心考点闭环
你手头这份《数据库系统概论复习期末试题及答案.pdf》,表面看是高校计算机专业常见的期末模拟卷,但拆开细看,它根本不是用来“刷题对答案”的——它是用20年教学沉淀压缩出来的知识校验器。我带过三届数据库课设,每次学生卡在E-R图转关系模式、范式分解、事务隔离级别判断这三处,翻遍教材也理不清逻辑链;而这套题从第3题(实体-联系模型)到第15题(3实体3m:n转6关系)、再到第5大题综合建模,全程踩着这些“断点”出题。它把抽象概念全锚定在可执行动作上:比如第7题“列车运营”主码选C(车次+日期),不是考死记硬背,而是逼你现场验证“单一属性能否唯一标识一次运营事件”;第19题并发操作图直接暴露“丢失修改”的时序漏洞,比教科书上的伪代码更刺眼。适合两类人:一是临考前72小时需要快速定位知识盲区的本科生,二是刚接手数据库运维、想用标准题检验自己对ACID/锁机制理解深度的初级DBA。它不教你从零入门,但能让你3小时内看清自己离“真正懂数据库”还差哪几块砖。
2. 单项选择题:20道题就是20个数据库系统“决策快照”,每道题背后都藏着一个真实场景的取舍逻辑
2.1 核心组件辨析:为什么DBMS才是数据库系统真正的“大脑”?
第1题问“数据库系统的核心是?”,选项B(数据库管理系统)是唯一正确答案。这里必须划重点:很多初学者误以为“数据库”本身(即存储数据的文件集合)是核心,但实际运行中,所有增删改查、事务控制、并发调度、安全校验,全由DBMS这个软件层完成。比如你执行INSERT INTO Student...,DBMS要先校验主键约束(第10题D选项能插入正是因为Sno和Sname满足NOT NULL)、再检查外键引用(第1题隐含的参照完整性)、最后写日志(第17题提到的日志文件)。没有DBMS,数据库文件只是一堆无法被安全访问的二进制垃圾。这解释了为什么第16题强调事务隔离性——DBMS必须保证T1读A=100时,T2的A=A-8写回不能干扰T1的后续操作,这是靠锁管理器(第18题S锁)和事务调度器协同实现的。
-- 模拟第10题建表语句,注意PRIMARY KEY和NOT NULL的强制约束 CREATE TABLE Student( Sno CHAR(4) PRIMARY KEY, -- 主键:唯一且非空,插入时必须提供值 Sname CHAR(8) NOT NULL, -- 非空:Sname字段不允许NULL,但Sex/Age可为空 Sex CHAR(2), -- 允许NULL,对应D选项中Sex=NULL的合法性 Age INT -- 允许NULL,对应D选项中Age=NULL的合法性 );提示:执行此建表后,尝试插入A选项
('5021','刘祥',男,21)会失败——因为男未加引号,SQL解析为列名而非字符串字面量;B选项NULL,'刘祥',NULL,21违反主键约束;C选项('5021',NULL,男,21)违反Sname NOT NULL约束。只有D选项满足所有约束条件。
2.2 数据独立性:物理与逻辑独立性的本质差异,决定你改表结构时会不会“炸掉”业务系统
第4题考物理独立性(用户程序与磁盘数据分离),第5题考逻辑独立性(应用程序与数据逻辑结构分离)。这两者常被混淆,但实际影响天壤之别。物理独立性意味着DBA可以更换存储引擎(如从InnoDB切到RocksDB)、调整页大小、甚至迁移到分布式存储,只要DBMS接口不变,应用代码完全无感;而逻辑独立性则依赖“模式/外模式映像”(第5题答案A),当DBA把Student表拆成Student_Info和Student_Contact两个表时,只需修改视图定义(第2大题第4小题的VIEW6就是典型外模式),原有查询SELECT * FROM Student仍能运行。这解释了为什么第2题选C(数据冗余度大)是错误特点——现代DBMS通过规范化(第13/14题涉及的范式理论)和索引(第2大题第3小题的UNIQUE INDEX)主动压制冗余,而非放任它存在。
2.3 关系代数与SQL映射:从R∩S到S-(S-R),看透集合运算背后的执行代价
第8题R∩S等价于S-(S-R),这不是数学游戏,而是优化器的真实工作逻辑。假设R有100万学生选课记录,S有10万门课程信息,R∩S需遍历R中每条记录查S是否存在匹配;而S-(S-R)先算S-R(10万门课减去R中已选的课程),再用S减去这个结果——实际执行时,数据库会自动选择哈希连接或排序合并,但底层仍是集合差运算。第9题全外联接(FULL OUTER JOIN)的选项A,直指现实痛点:学校教务系统必须同时展示“未分配宿舍的学生”和“空床位”,若用左联接(B)会漏掉空床位,右联接(C)会漏掉未住宿学生。这种需求在ERP系统库存模块中极为常见——既要显示“有库存但未销售的商品”,也要显示“已下单但仓库缺货的订单”。
3. 填空题与简答题:10个空格+3道问答,精准定位你对数据库“肌肉记忆”的薄弱环节
3.1 基础概念填空:每个空都是数据库设计的“宪法条款”
填空题第1空“关系数据模型由关系数据结构、关系操作和______三部分组成”,答案“关系完整性约束”看似简单,但实操中90%的线上故障源于此。比如第10题建表时定义PRIMARY KEY,本质就是声明主码完整性约束;第11题授权语句GRANT UPDATE(QTY) ON SPJ TO 李勇,则是通过权限约束控制数据修改边界。第5空“候选码是A和(B,C)”,直接关联第5大题范式分解——当函数依赖A→B,A→C,A→D,(B,C)→A存在时,A和(B,C)都能唯一标识元组,但(B,C)→A导致A部分依赖于(B,C),破坏BCNF(第5大题第1小题结论)。这揭示了一个血泪经验:设计表时若发现某属性能被多个属性组合推导出来,立刻警觉可能存在冗余或更新异常。
| 填空题序号 | 答案 | 关联实战场景 | 参数/配置要点 |
|---|---|---|---|
| 第2空 | 属性 | 自然连接(NATURAL JOIN)要求表间有同名同类型列 | 若两表均有id列但类型不同(INT vs VARCHAR),自然连接会失败,需显式指定ON条件 |
| 第3空 | CREATE UNIQUE INDEX Stusname ON student(Sname) | 用户名去重场景,避免注册重复姓名 | UNIQUE确保Sname列无重复值,ON student(Sname)指定索引字段,索引名Stusname便于后续DROP INDEX |
| 第4空 | NOT IN | 查询“未购买商品的客户”时常用,但NULL值会导致结果为空 | 若子查询返回NULL,!=ALL和NOT IN均失效,应改用NOT EXISTS |
| 第6空 | 命名冲突 | 不同部门设计的E-R图中,“员工编号”可能被命名为emp_id或staff_no | 合并分E-R图时需统一命名,否则转换关系模式会产生歧义 |
3.2 简答题:3道题直击DBMS最脆弱的三个“神经节点”
第1题“参照完整性规则”,本质是外键约束的法理依据。现实中,删除父表记录前若不处理子表关联数据,就会触发ON DELETE CASCADE或RESTRICT策略(MySQL默认RESTRICT)。第2题“视图作用”中的第4点“安全保护”,对应第11题授权粒度——给财务人员只授UPDATE(QTY)权限,而非整个SPJ表,这是最小权限原则的落地。第3题“登记日志文件原则”(先写日志后写库),是崩溃恢复的基石。想象一下:T1执行UPDATE EMP SET SALARY=1200 WHERE ENO='E001',若先改数据库再写日志,断电后新工资值丢失且无日志可回滚;反之,日志中已记录“将E001工资改为1200”,重启后DBMS按日志重做(REDO)即可恢复。
4. 设计题:4道SQL+1道范式分解,暴露你在真实业务场景中写SQL的“手抖时刻”
4.1 多表关联查询:从“张三没选的课”到“供应相同商品的商店”,练就SQL思维肌肉
第1题SQL查询SELECT CNO FROM C WHERE CNO NOT IN (SELECT CNO FROM S,SC WHERE S.SNO=SC.SNO AND SNAME='张三'),表面是求补集,实则考验对NULL的敏感度。若子查询结果含NULL(如SC表中某记录SNO为NULL),NOT IN会返回空集——这是线上SQL最隐蔽的坑。正确写法应为:
-- 更健壮的写法:用LEFT JOIN + IS NULL替代NOT IN SELECT C.CNO FROM C LEFT JOIN ( SELECT DISTINCT SC.CNO FROM S JOIN SC ON S.SNO = SC.SNO WHERE S.SNAME = '张三' ) AS T ON C.CNO = T.CNO WHERE T.CNO IS NULL;第2题第(2)小题“找供应相同商品的商店”,是典型的集合包含(Containment)问题。NOT EXISTS嵌套三层的写法(题干答案)虽正确,但性能极差。生产环境应改用GROUP BY + HAVING COUNT:
-- 高效解法:统计各商店供应的商品数,与256号商店对比 SELECT A.ANAME, A.CITY FROM A JOIN AB ON A.A# = AB.A# WHERE AB.B# IN ( SELECT B# FROM AB WHERE A# = '256' ) GROUP BY A.A#, A.ANAME, A.CITY HAVING COUNT(DISTINCT AB.B#) = ( SELECT COUNT(DISTINCT B#) FROM AB WHERE A# = '256' );4.2 范式分解实战:从1NF到BCNF的“手术刀式”拆解,拒绝纸上谈兵
第5大题第(2)小题要求将R(A,B,C,D,E)分解为BCNF。题干给出函数依赖ABC→DE, BC→D, D→E,我们一步步拆:
- 找候选码:因
ABC→DE,ABC能推出全部属性,且无更小子集满足,故ABC是候选码; - 检查1NF:关系R已是平面表,满足;
- 检查2NF:非主属性D,E对候选码ABC存在部分依赖(BC→D中BC是ABC真子集),故R∉2NF;
- 消除部分依赖:按
BC→D拆出R2(BC,D),剩余R1(ABC,DE); - 检查R2:BC为候选码,D→E不在R2中,但R2中
BC→D是完全依赖,满足BCNF; - 检查R1:函数依赖变为
ABC→DE,但D→E在R1中仍存在传递依赖(ABC→D→E),需进一步拆; - 消除传递依赖:按
D→E拆出R22(D,E),剩余R21(ABC,D)。
最终得到R1(ABC)、R21(BC,D)、R22(D,E)三个BCNF关系。关键洞察:每次分解都要验证新关系的函数依赖集,不能简单按依赖左边分组——比如若错误地按ABC→DE拆出R'(ABC,DE),R'中仍存在D→E传递依赖,未达BCNF。
5. 综合题与避坑指南:E-R建模到关系模式的“最后一公里”,以及95%考生栽倒的5个深坑
5.1 E-R图到关系模型:从“工厂-产品-职工”业务语义,读懂数据库设计的底层契约
第5大题综合题描述“工厂生产多种产品,产品可在多个工厂生产”,明确是m:n联系;“职工只能在一个工厂工作”,是1:n联系。E-R图中必须体现:
- 工厂与产品间“生产”联系带属性“计划数量”(因多对多联系需独立成表);
- 工厂与职工间“聘用”联系带属性“聘期、工资”(1:n联系可合并到职工表);
- 实体工厂、产品、职工的主码分别为工厂编号、产品编号、职工号。
转换后的关系模式:
工厂(工厂编号,厂名,地址):主码工厂编号;产品(产品编号,产品名,规格):主码产品编号;职工(职工号,姓名,工厂编号,聘期,工资):主码职工号,外码工厂编号引用工厂表;生产(工厂编号,产品编号,计划数量):主码(工厂编号,产品编号),外码分别引用工厂和产品表。
注意:题干要求“1:1和1:n联系进行合并”,故聘用联系不单独建表,而将工厂编号作为职工表的外键——这正是外键约束的典型应用场景,确保职工记录必属某个有效工厂。
5.2 避坑指南:那些让阅卷老师皱眉、让线上服务宕机的致命细节
现象:第10题插入元组时选A选项
('5021','刘祥',男,21)报错
原因:SQL中字符串字面量必须用单引号包裹,男未加引号被解析为列名,导致语法错误
解决:改为('5021','刘祥','男',21),或使用标准SQL的CAST('男' AS CHAR(2))现象:第11题授权语句写成
GRANT QTY ON SPJ TO '李勇'被扣分
原因:权限对象名李勇是标识符,不应加单引号;加引号后变成字符串字面量,DBMS找不到该用户
解决:严格按GRANT UPDATE(QTY) ON SPJ TO 李勇书写,用户名不加引号现象:第2大题第(2)小题用
NOT IN写“供应相同商品”查询,结果为空
原因:子查询SELECT B# FROM AB WHERE A#='256'若返回NULL(如256号商店无商品),NOT IN逻辑失效
解决:改用NOT EXISTS或LEFT JOIN ... IS NULL,或在子查询中加WHERE B# IS NOT NULL现象:第5大题范式分解后,R21(BC,D)的函数依赖写成
BC→D,但未说明BC是候选码
原因:BCNF定义要求“每个非平凡函数依赖的决定因素必须是超码”,仅写BC→D不证明BC是候选码
解决:需验证BC是否能推出全部属性(本例中BC仅推出D,故R21中BC是候选码)现象:第3大题简答题“登记日志原则”只答“先写日志后写库”,未提“按时间序登记”
原因:并发事务日志若乱序,崩溃恢复时无法确定操作先后,导致数据不一致
解决:必须强调两条原则缺一不可,日志序列号(LSN)是DBMS保证顺序的核心机制
6. 从“抄答案”到“建能力”:用这套题反向构建你的数据库知识图谱,附赠3个验证技巧
这套题最大的价值,不是让你记住“第7题主码是车次+日期”,而是教会你用题干信息反推设计原则。比如看到第7题“列车运营”实体含车次、日期、实际发车时间等属性,立刻启动三步验证:第一,单属性车次能否唯一标识?否(同一车次每天运行);第二,单属性日期能否唯一标识?否(多车次同日运行);第三,车次+日期组合能否唯一?是(G101次2024-06-01只运行一次)。这个过程,就是ER建模中“识别实体-确定主码”的标准流程。再如第19题并发操作图,不要只背“丢失修改”,而要动手画时间轴:T1读A=100→T2读A=100→T1写A=95→T2写A=92,最终A=92而非95,这就是丢失修改的具象化。
我一般会用三个技巧验证自己是否真正掌握:
- 逆向命题:把第14题“设计关系模式是逻辑设计阶段任务”改成判断题“物理设计阶段才确定关系模式”,然后解释为何错误——物理设计关注索引、分区、存储参数,关系模式已在逻辑设计中固化;
- 场景移植:将第5大题“工厂-产品-职工”模型,迁移到电商场景:“店铺-商品-用户”,此时“用户收藏商品”是m:n联系,必须建收藏表,而非简单在用户表加商品ID数组;
- 错误注入:故意在第10题建表语句中删掉
PRIMARY KEY,然后执行D选项插入,观察是否允许重复Sno——这能直观感受主键约束的强制力。
从那以后我每次审数据库设计文档,都强制走一遍“主码验证→范式检查→外键追溯→日志策略确认”四步,哪怕只是看别人写的DDL。因为这套题早已不是试卷,而是刻在脑子里的检查清单。希望帮到你。
本文还有配套的精品资源,点击获取