数据库系统概论核心考点精讲:从关系模型到SQL与范式
2026/9/19 7:24:03 网站建设 项目流程

简介:面向数据库系统概论课程的学习者与备考者,这份期末试卷资料系统覆盖了实体联系分类、数据库系统核心、关系模型与关系代数、SQL语言、数据安全、数据依赖、数据库设计、CGI规范及面向对象数据库系统等核心考点,适合考前自测与查漏补缺。压缩包内仅含1个PDF文件,大小约218KB,便于直接下载阅读。已有823人浏览学习,可见其具备一定参考价值。试卷按填空、判断、选择、简答、综合题五大题型组织,附有完整参考答案;题目涉及数据库管理系统的六大功能、SQL语言的特点、数据完整性保护、倒排文件查找、E-R图设计等典型问题,还包含SQL查询语句编写和学生-课程数据库的E-R图设计例题,能有效帮助读者检验对数据库原理与应用的掌握程度,巩固课堂所学。

1. 一套期末考试卷子,比背书更值得做三遍

试卷算得上数据库系统概论的"知识点压缩包":填空20分覆盖实体联系类型、关系模型、QBE、数据依赖;SQL综合题把连接查询、范围查询、等值连接在10分里全部考到;从2级封锁协议到倒排索引再到面向对象数据库,每个空都在检验你是不是真正理解了而不是记了定义。这套卷子适合两类人:一类是考前一周拿它做查漏清单,另一类是准备面试时拿它当基础题底册。我的做法是把答案做成索引,每道题对应教材章节,错题就是你的薄弱页。这比抱着书重头看效率高得多。

2. 实体联系、关系模型与关系代数:把试卷填空题变成知识索引

2.1 三张基础表决定了后面所有题

试卷填空题第一题考的实体联系按照联系方式分为一对一(1∶1)、一对多(1∶n)、多对多(m∶n),这道题在《数据库系统概论》里属于概念层的内容,但在实际建模时它直接决定你E-R图里线怎么画、联系怎么落。综合题第二题就是让学生与课程画m:n联系,中间实体"学习(学号,课程号,成绩)"把多对多拆成两个一对多,这是规范化思想在概念设计阶段的提前应用,也是后续设计关系模式时避免冗余的第一道闸门。

第二空"数据库系统的核心是数据库管理系统"以及第三空"关系模型中实体和联系都用关系(二维表)表示",这两题连在一起看很有意思。关系模型的一个核心主张就是"数据结构单一化"——实体是表,联系也是表,SC表承载的就是学生和课程之间的选修联系。相比网状模型要用指针表达联系,关系模型用数据本身说话,这也是它最终胜出的原因。备考时不光要记住答案,还要能回答"为什么联系也用表表示",因为这是关系模型区别于层次、网状模型最根本的设计决策。

2.2 关系代数里的选择、投影、连接与除

2.2.1 专门运算的作用范围

关系代数中专门的关系运算包括选择、投影、连接、除。注意这里的用词是"专门的关系运算",区别于并、交、差这些传统的集合运算。专门运算的操作对象是关系,操作结果仍然是关系,这是关系代数的闭包性质。选择题第二题考的"关系演算的基础是数理逻辑中的谓词演算",这里要区分关系代数(集合并交差选择投影连接除)和关系演算(元组关系演算、域关系演算)两条技术路线。

2.2.2 QBE与域关系演算的关联

填空第五题"1975年IBM公司的M.Zloof提出的QBE语言是一个很有特色的域关系演算语言"。QBE(Query By Example)的特色是面向用户、以表格形式填写查询条件,属于域关系演算的典型代表。这里有个容易混淆的点:关系演算分为元组关系演算和域关系演算,ALPHA语言属于元组关系演算,QBE属于域关系演算。如果只是背答案,一旦换一种问法"ALPHA语言属于哪种演算"就又不会了。

2.3 判断题里藏着的存储与索引细节

判断题第一题考IMS系统的HSAM存储结构,答案是"检索方便,但插入删除不方便"所以打×。HSAM是层次顺序存取方法,数据按层次顺序物理连续存放,检索可以用顺序扫描加指针快速定位,但插入和删除需要移动大量数据。这个知识点看起来冷门,但对应的是文件组织和存储结构的基础原理。

判断题第九题"在向量结构的顺序文件中,插入记录比较困难"打√。向量结构指记录定长、按序连续存放,插入点在中间时需要整体后移。这个知识点可以联系实际数据库中的页分裂——B+树索引插入导致页分裂时要移动部分记录,代价高是共通的。复习到文件结构时,把堆文件、顺序文件、索引文件三种组织方式的插入、删除、检索成本列一个对比表,这一类的判断题就不会再错。

文件组织方式检索插入删除
堆文件全表扫描末尾追加,代价低定位后删除,可能有空洞
顺序文件按关键字二分查找需移动记录,代价高需移动记录,代价高
索引文件通过索引定位索引维护有额外开销索引维护有额外开销

这个表建议自己画一遍,比单纯背HSAM的结论更稳,因为判断题变着法考的就是这张表的逻辑。

3. SQL四种能力与综合题SQL:从三条语句延伸到实际写法

3.1 SQL综合统一的设计思想

填空题第六题"SQL语言集数据查询、数据操纵、数据定义和数据控制功能于一体"。简答题第二题又要求阐述SQL的特点,综合统一是第一个特点。这四个功能对应四类语句:数据查询SELECT、数据操纵INSERT/UPDATE/DELETE、数据定义CREATE/ALTER/DROP、数据控制GRANT/REVOKE。采用同一种语法结构提供交互式和嵌入式两种使用方式,是SQL能成为关系数据库标准语言的重要原因——应用程序里嵌的SQL和命令行里敲的SQL基本一样,降低了从DBA到开发者的迁移成本。

3.2 综合题的三条查询语句拆解

试卷综合题第一题给出Student、Course、SC三张表,要求写三条SQL。第一条查询年龄在20岁以下的学生姓名与年龄:

-- 查询所有年龄在 20 岁以下的学生姓名与年龄 SELECT Sname, Sage FROM Student WHERE Sage < 20;

很多人在这个题上出错的地方是"20岁以下"到底包不包括20岁。标准答案是Sage<20,因为"以下"在中文里语义有歧义,但数据库教材里的惯例是按数学含义处理,小于20就是小于20,不包括等于。如果题目写"20岁及以下"才用<=。我这里习惯先确认条件边界再写,防止把not>=和<混用。

第二条查询年龄不在20~23之间(包括20和23)的学生姓名、系别和年龄:

-- 查询年龄不在 20~23 之间(含边界)的学生的姓名、系别和年龄 SELECT Sname, Sdept, Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;

NOT BETWEEN的语义是"不在区间内",BETWEEN 20 AND 23在SQL标准中包含两个端点值。等价写法是Sage<20 OR Sage>23。这里要提醒的是,如果改用NOT(Sage>=20 AND Sage<=23),逻辑上相同,但可读性明显更差。实际开发时我倾向用NOT BETWEEN,因为它在执行计划里通常能被优化器识别为范围条件,配合索引可以走Index Seek而不是全表扫描。

第三条要求查询每个学生及其选修课程的情况:

-- 查询每个学生及其选修课程的情况(隐式等值连接) SELECT Student.*, SC.* FROM Student, SC WHERE Student.Sno = SC.Sno;

这是一道经典的等值连接题。Student与SC通过Sno关联,结果集包含两表所有列。注意这里有个查询意图的坑:题目说"每个学生及其选修课程的情况",有些同学会加LEFT JOIN去保留没选课的学生,但教材标准答案是内连接写法,因为SC表中存在的记录才表示选过课。不过在实际业务里,"每个学生"这个表述确实会产生歧义,如果需求是"没选课的学生也要显示",就必须改成:

-- 保留未选课学生的左外连接写法 SELECT Student.*, SC.* FROM Student LEFT JOIN SC ON Student.Sno = SC.Sno;

对比两种写法可以看到:内连接丢弃没有匹配行的学生记录,左外连接把未选课学生保留下来且SC列填NULL。我一般会提醒读者,做题时先看题目语义,再决定连接类型,不要看到"每个""所有"就条件反射用外连接。

代码逻辑说明:SELECT后同时出现Student.和SC.,表示把两张表的全部列都取出,如果两表有同名列(这里恰好没有同名列,因为SC用了Sno/Cno/Grade),使用表名前缀限定是必须的。

3.3 从试卷SQL到参数化查询的进阶

试卷只会考静态的SELECT,但实际工程里写SQL的第一个原则就是参数化,比如在Java的JDBC或Python的psycopg2里用占位符而不是字符串拼接:

# Python 中使用参数化查询避免 SQL 注入 import sqlite3 conn = sqlite3.connect("student_course.db") cur = conn.cursor() min_age = 20 cur.execute( "SELECT Sname, Sage FROM Student WHERE Sage < ?", (min_age,) ) rows = cur.fetchall()

这里的?是占位符,参数以元组形式传入,数据库驱动会处理转义,而不是把min_age直接拼进SQL字符串。这样做一方面防止SQL注入,另一方面让数据库能复用执行计划。如果使用字符串格式化去拼条件,比如f"SELECT ... WHERE Sage < {min_age}",每次参数变化都可能触发重新解析,还有注入风险。这与试卷第三条连接查询的考点其实是一体两面——先想清楚结果集的语义,再决定语句结构。

3.4 SQL特点在简答题中的组织方式

简答题第二题"简述SQL语言的特点"是高频考题,标准答案框架是五条:综合统一、高度非过程化、面向集合的操作方式、同一种语法结构提供两种使用方式、语言简洁易学易用。对我来说这五条可以压缩成记忆锚点:"一个语言干了四件事,不关心过程只管集合,写法统一还简单"。

非过程化是SQL区别于第三代编程语言最核心的特性——你告诉数据库要什么数据,通过什么路径取数据由优化器决定。这一点在回答"SQL与高级语言的区别"这类扩展题目时同样适用。

4. 函数依赖、范式与数据库设计:从3NF到BCNF的消歧与实战定位

4.1 主属性对码的部分依赖与传递依赖

填空题第九题"关系模式由3NF转化为BCNF是消除了主属性对码的部分函数依赖和传递函数依赖"。这个答案需要仔细辨析,因为3NF的定义本身就涉及非主属性对码的依赖消除。具体来说,从2NF到3NF消除的是非主属性对码的部分函数依赖和传递函数依赖,从3NF到BCNF则更进一步,消除主属性对码的部分依赖和传递依赖。

为了直观理解两级规范化的差异,我用一个选课场景来说明。设关系模式R(学号,课程号,系别),主码是(学号,课程号)。如果系别只由学号决定,那么存在部分函数依赖"学号→系别",R只达到1NF,将其分解为R1(学号,系别)和R2(学号,课程号)后消除部分依赖,达到2NF。这是从1NF到2NF的路径。

再从2NF推到3NF,考虑关系模式S(学号,系别,系主任),学号→系别,系别→系主任,于是存在传递依赖"学号→系主任",将其分解为S1(学号,系别)和S2(系别,系主任),消除传递依赖,达到3NF。到了3NF后,如果候选码不止一个,可能仍有主属性对码的部分依赖,例如关系模式T(学生,课程,教师)中,约束为"一个学生选一门课只对应一个教师,一个教师可以教多门课",候选码是(学生,课程)和(学生,教师),此时主属性"教师"对候选码(学生,课程)存在部分依赖,T虽然是3NF却不满足BCNF,需要进一步分解。

4.2 分解保持函数依赖与3NF目标的对应关系

选择题第三题"若要求分解保持函数依赖,那么模式分解一定能够达到3NF"。这个问题的陷阱在于,BCNF分解不一定能保持函数依赖,而3NF分解总能做到。所以当题目强调"保持函数依赖"时,正确答案是3NF而不是BCNF。如果去掉"保持函数依赖"这个前提,问"模式分解能够达到的最高范式",那么答案可以是BCNF甚至4NF,但4NF分解会牺牲函数依赖保持性。这个考点建议当成结论直接记,但背后逻辑需要理解:BCNF的分解算法基于函数依赖闭包做投影,可能把一个依赖拆分到多个关系里导致依赖丢失,而3NF的合成算法通过规范化覆盖每个函数依赖的左边,确保依赖保留。

对于数据库设计选择,经验法则是:通常设计到3NF或BCNF即可,BCNF在数据冗余控制上更强,但分解后查询需要更多连接操作。实际业务里如果发现因为过度分解导致查询性能问题,很多团队会反规范化到2NF级别并依靠应用层保证一致性,这种取舍在《数据库系统概论》第六版的扩展阅读里有讨论,考试不会考,但工作里常见。

4.3 数据字典的建立时机

选择题第五题"建立数据字典的时机是需求分析阶段"。数据字典是数据流图的配套产物,包含数据项、数据结构、数据流、数据存储和处理过程五类条目,在需求分析阶段随数据流图逐步形成。它是下一步概念结构设计的基础素材,如果在概念设计阶段才开始收集数据字典,等于需求分析的输入还没有固化就开始画E-R图,后面大概率返工。

开发阶段主要产出数据字典的作用
需求分析数据流图、数据字典、需求说明书定义数据项与数据流的结构
概念结构设计E-R图从数据字典提取实体与属性
逻辑结构设计关系模式将E-R图转换为关系并规范化
物理设计存储结构与存取方法依据数据量选择索引与分区策略

这套流程对应简答题第三题"什么是数据库系统"里提到的"数据库设计应包括结构设计和行为设计"。结构设计指概念模式、逻辑模式、内模式的分层设计,行为设计指应用程序对数据的操作设计。数据字典在需求分析阶段就介入,正是因为结构设计的起点是数据需求而不是表结构。

4.4 完整性保护与安全性访问控制

判断题第八题"概念级对应于它实际存储的数据"打×,概念级(模式)是数据库中全体数据的逻辑结构和特征的描述,实际存储的数据对应内模式。而填空题第十一题"数据库管理系统保证数据安全的主要措施是进行存取控制",注意不能写成"加密"做主答案,教材标准答案是存取控制。加密属于辅助手段,第一道防线是存取控制,通过GRANT/REVOKE授权来控制不同用户对数据的访问权限。

简答题第四题"试述数据库完整保护的主要任务和措施"的答案组织方式,任务部分答"保障数据的正确性、有效性、协调性,提高数据对用户的可用性",措施部分三条:适时检查完整约束条件保证语义完整;控制并发操作不破坏完整性;系统故障后即时恢复。我补充一点容易被忽略的细节:完整约束的检查时机分为立即执行约束和延迟执行约束,事务的每个维护操作执行后立即检查属于前者,判断题第五题说"总是在事务的每个维护操作执行后立即进行"打×,因为还有延迟约束的场景,比如触发器里的DEFERRABLE约束可以到事务提交时才检查。

5. 封锁协议与倒排索引:两个常被忽略却反复考的进阶点

5.1 二级封锁协议区别于一级和三级的检查点

选择题第四题"1级封锁协议加上T要读取的数据R加S锁是2级封锁协议"。要理解这条题,先把三级封锁协议的差异表列出来:

封锁协议操作规则解决的问题
1级写数据前加X锁,事务结束释放丢失修改
2级1级基础上,读数据前加S锁,读完释放丢失修改、读脏数据
3级1级基础上,读数据前加S锁,事务结束释放丢失修改、读脏数据、不可重复读

二级与三级的关键区别在S锁的释放时机:二级在读完立即释放,所以两个事务可以在同一事务未提交前交替读取同一数据;三级把S锁保持到事务结束,防止其他事务在此期间修改数据,从而避免不可重复读。注意二级协议没有完全解决不可重复读和幻读的问题,如果需要严格可串行化,用三级协议或加范围锁。实际数据库的隔离级别与封锁协议的对应关系可以单独整理,但对付这类选择题,抓住"S锁释放时机"这一个变量就够了。

5.2 倒排文件部分辅索引查找的交集策略

简答题第五题"在倒排文件中,如果只建立了部分关键字的辅索引,如何进行查找"。标准答案分两步:先对询问中涉及的关键字在已建立的辅索引中求指针交集P,然后对P所指记录逐个验证其他未建索引的关键字是否匹配,所有匹配记录即查询结果。这本质上是"最小候选集"策略。以图书检索为例,假如建立辅索引的关键字有"数据库"和"系统",查询条件是"数据库与系统概论"且"概论"没有辅索引,第一步先在两个辅索引中取文档指针交集,得到一个候选文档集合,数量远小于全表,第二步再逐条检查候选文档的"概论"字段,最终得到结果集。

这个思路与数据库查询优化里的过滤顺序一致:先走索引缩小扫描范围,再用谓词过滤剩余行。理解为"先用代价最低的路径缩小候选集,再在候选集上做精确匹配"比死记两句话更有效,因为题目如果改问"为什么先求交集而不是先验证"答案也呼之欲出——避免对海量无关记录做逐条访问。

5.3 用这套试卷做一次自测的验证方法

复习收尾时可以把试卷当作检查清单,限时60分钟完成,重点看三类错误:填空题暴露的是概念精确度,比如函数依赖那题写"完全函数依赖"还是"部分函数依赖";判断题暴露的是边界条件,比如"总是"这类绝对化表述往往是错的;综合题暴露的是SQL语义掌握程度,尤其是连接类型的选择。每错一题,回到教材对应章节做10道同类题巩固。同一套题隔三天做第二遍,错误率明显下降,说明知识点已经内化,可以进入下一轮学习。

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

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

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

立即咨询