简介:华南师范大学《数据库》期末复习知识点汇总以 PDF 形式呈现,主要面向校内该课程学生,也适用于学习数据库系统概论的学习者考前系统梳理。内容紧扣课程大纲,覆盖数据库三级模式与两级映像、数据独立性、数据库系统组成、数据定义语言、数据操纵语言、数据控制语言,以及关系定义与性质、关系语言、关系模式与实例;同时系统整理了选择、投影、连接、并、差、交、除等关系代数与关系演算核心操作,并注明更名、赋值、广义投影及聚集函数等扩展知识点,便于对照教材逐项检查掌握程度。资源包仅含 1 个 PDF 文件,大小约 1.18MB,轻量便携,可直接打印或在平板设备上标注学习。目前已有 274 人浏览学习,尤其适合期末冲刺阶段集中复习与考前查漏补缺使用。
1. 华南师范大学数据库期末复习 PDF:这份笔记到底解决了什么问题
期末周刷到这份《华南师范大学-数据库-期末复习知识点汇总.pdf》,我的第一反应是:终于有人把老师上课讲的零散考点收拢成一份能背的清单了。数据库这门课最难受的地方不在于内容难,而在于知识点分布散——教材讲关系代数、SQL、范式、事务、E-R 图分成好几章,考试却喜欢混在一起出题。这份 PDF 把三级模式、关系代数、范式判断、无损分解这些高频考点按章节压缩成可直接背诵的文字,对三类人最有用:正在备考华南师范数据库期末的学生、想快速过一遍关系代数和范式计算的考研党、以及工作中要补数据库理论底子的开发。我花了一个晚上把这份笔记对照教材逐条核过,值得下,但有几个地方需要你动手补全才能拿高分。
2. 三级模式与数据独立性:十道选择题里有七道出自这里
2.1 三级模式两级映像的记忆框架
三级模式这部分在期末笔试里几乎以原题形式出现,尤其是“内模式、模式、外模式分别描述什么”这个考点。笔记里给的划分是:内模式又称存储模式或物理模式,描述数据的物理结构和存储方式;模式是全体用户的公共数据视图,描述全局逻辑结构;外模式是某个用户的数据视图,即局部逻辑结构。注意顺序不能乱,考试喜欢把“模式”和“外模式”的定义互换来考你。我一般用一句话记:外层管局部、中层管全局、内层管物理。
两级映像里最容易混淆的是数据逻辑独立性和物理独立性。笔记写得很清楚:模式改变时修改外模式/模式映像,让外模式保持不变,从而应用程序不用改,这叫逻辑独立性;存储结构改变时修改模式/内模式映像,让模式保持不变,应用程序同样不用改,这叫物理独立性。记忆技巧就是把影响范围记住——逻辑独立性保护的是“应用程序”,物理独立性保护的是“模式本身”。判断题里如果出现“存储结构变了程序不用改是逻辑独立性”这种表述,直接打叉。
2.2 SQL 三大语言的分类与典型语句
数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)的分类在选择题里反复出现。笔记里的划分很标准:DDL 用 create、alter、drop、declare,处理表结构;DML 用 select、insert、delete、update,处理数据内容;DCL 负责权限控制。这里有个选择题陷阱:declare 很多同学不知道属于 DDL,因为平时写存储过程用 declare 声明变量,但作为 SQL 标准,declare 被归入数据定义。另一个容易记混的是——select 虽然叫“查询”,但在功能分类上属于数据操纵语言,因为它属于数据检索和修改的范畴。
数据库系统的组成也很喜欢出多选题:数据库、硬件、软件、人员四块,缺一不可。注意“人员”这个词考得细,包括数据库管理员、应用程序员、终端用户等角色,别只写前三项。
3. 关系模型与关系代数:把文字查询翻成表达式
3.1 关系的五条性质与关系模式、实例的区分
关系的定义是“域上笛卡尔积中有意义的子集”,这句话笔试要能默写。五条性质拿笔记逐个看:列同质、不同列可来自同一域但属性名不同、行列顺序无关、元组不能完全相同、分量不可再分。最后那条“分量不可再分”就是第一范式(1NF)的依据,这个关联在范式章节还会再考。
关系模式和关系实例的区别也是高频选择题。模式是结构,比如 student(student-no, name, sex),关注“有哪些字段”;实例是特定时刻的数据内容,关注“有哪些记录”。最常考的表述是:模式相对稳定、实例随时间变化。我建议自己举一个例子:一个班级表,结构一学期不变,但学生因为休学和转学不断增删——这个例子能同时在简答题里当论据。
3.2 关系代数的八种运算怎么套用到考题里
关系代数这部分,期末考试喜欢给文字查询让你写表达式,反向考法也常见——给表达式让你用自然语言描述。笔记覆盖了选择、投影、连接、并、差、交、除、更名、聚集、赋值。我的经验是先分清哪些算子处理行、哪些处理列:选择(σ)从行的角度筛选元组,投影(π)从列的角度取属性。连接分为 θ 连接、等值连接和自然连接,自然连接最特别的是公共属性只保留一列。
这里我把笔记里两道经典题重构一下,它们大概率会换数字出现在你的卷子上:
- 求选了 01 号或 02 号课程的学生号:πS#(σC#='01'(SC)) ∪ πS#(σC#='02'(SC))
- 求选了 01 号但没选 02 号的学生号:πS#(σC#='01'(SC)) − πS#(σC#='02'(SC))
“或”用并运算、“且”用交运算、“没选”用差运算——这个对应关系十分机械,先判断题目逻辑词再选算子,基本不会错。除运算的题目出现频率不高但一旦出现就很拉分,核心思路是先把被除关系中除属性外的列投影出来,再减去不符合条件的元组。遇到“查询选了所有课程的学生”这种带“所有”字样的题目,用除运算处理,考试时如果时间紧可以先跳过最后回头再做。
聚集函数那里注意:sum/avg/count/max/min 五个要会写,distinct 的写法是 count-distinctP#(PC),这个写法容易写错——不是 count(distinct P#),而是把 distinct 作为连接符拼在函数名后面。另外聚集函数忽略空值,但 count() 不忽略,所以统计行数用 count() 最保险。
外连接那块笔记也给了:左外连接 = 自然连接 + 左侧失配元组(空值填充),右外连接 = 自然连接 + 右侧失配元组,全外连接 = 自然连接 + 两侧失配元组。我一般先画两个小表,手动把失配行补上 NULL 再对照表达式,比死背定义可靠。
4. 范式判断避坑指南:四个考场高频翻车现场
这一章直接上我在复习和辅导别人时遇到的最典型的几个错法。每条都按现象、原因、解决来写,对应笔记里第一范式到 BCNF 的判断方法。
4.1 翻车一:把“候选码的一部分”当成“非码”
现象:判断范式级别时,看到函数依赖左边是某个候选码的真子集,比如 R(ABCDE) 候选码是 ABC,函数依赖 AB→D,有人直接说“左边不是超码,所以是 BCNF 违规”——结论对,但解释全错。
原因:BCNF 的判定条件是“每个非平凡函数依赖的左边必须是超码”,而 AB 在整个关系里是候选码 ABC 的一部分,但 AB 本身不是超码。关键在于区分“候选码的一部分”和“非码”这两个概念:AB 是非超码但它是候选码的子集,不是“非码属性”;D 是非码属性。真正需要区分的是函数依赖左边是超码、候选码的一部分、还是完全不含候选码的普通属性集。
解决:拿到一道范式题先写出所有候选码,然后对每个函数依赖做三问:左边含不含候选码?如果含,是完整包含还是只含一部分?右边是不是非码属性?左边不含候选码——至少不是 BCNF;若右边含非码属性——不是 3NF;左边是候选码真子集且右边含非码属性——不是 2NF。笔记最后那个小表格就是干这个用的,先背熟再做题。
4.2 翻车二:三个以上属性组候选码漏找
现象:题目给 R(A, B, C, D, E, F) 和函数依赖 AB→D, C→E, AB→C, C→F,问候选码,有同学直接拿 AB 当候选码,理由是“AB 能推出的最多”。实际上还要验证 AB 的闭包是否覆盖全部属性。
原因:候选码判定要看属性闭包是否等于全集,且任意真子集闭包不等于全集。AB 的闭包是 ABCDEF(通过 AB→C、C→E、C→F 以及 AB→D),所以 AB 确实是候选码。但如果函数依赖换一下,比如改成 B→C 而不是 AB→C,候选码就可能变成 AB 之外的组合。这个例子说明一个陷阱:不能只从“谁被依赖最多”判断候选码,必须跑一遍闭包计算。
解决:按笔记里的算法老老实实算。第一步选一个看似可能的属性集 L,算 L+;第二步检查 L+ 是否包含全部属性,包含就是超码;第三步去掉 L 里冗余属性,再算闭包,直到不能去掉为止,剩下的就是候选码。平时练习建议把闭包计算的每一步写出来,考试时至少能拿步骤分。
4.3 翻车三:无损连接判定用“交是超码”时看错方向
现象:把 R 分解成 R1(ABC) 和 R2(BCD),判断是否无损时,有人直接看 R1∩R2 = BC,然后说“BC 在 R1 里,所以是超码”。但 BC 是不是 R1 的超码要看 BC 的闭包是否包含 ABC 的全部属性,不是看 BC 在不在 R1 里。
原因:无损连接的充分必要条件是 R1∩R2 → R1−R2 或 R1∩R2 → R2−R1 至少一个成立。这里要用属性闭包去验证函数依赖是否成立,而不是凭直觉。BC 在 R1 里也只能说明 BC→B、BC→C 是平凡的,不能说明 BC→A 成立。
解决:老老实实算 (BC)+。如果 (BC)+ 包含 A,则 BC→A 成立,即 BC→R1−R2,分解无损;如果 (BC)+ 还包含 D,也能通过另一条路径判断。我习惯把“交→差”两个方向都验一遍,只要一个成立就是无损。顺便记一个结论:如果两个子关系的交集是两个子关系之一的超码,那么这个分解必定无损——考试时先用这条快速判断,不行再走闭包验证。
4.4 翻车四:3NF 分解算法落掉候选码补全步骤
现象:用笔记里的 3NF 分解算法处理 R(A,B,C,D,E),F = {A→B, C→D, D→E},算出 R1(AB), R2(CD), R3(DE) 就结束了,丢掉了 R4(AC)。但没了 R4,分解后 A 和 C 找不到一个关系同时容纳它们,连接不起来。
原因:3NF 分解算法的第二步——如果 R 的候选码没有完全出现在任何一个输出关系里,要补一个包含候选码的新关系。这个步骤专门用来保证分解的依赖保真和无损连接,但因为候选码的判定本身容易漏,第二步经常被跳过。
解决:做题顺序固定——先求候选码,再做第一步遍历每个函数依赖生成关系,最后检查候选码是否被某个 Ri 完整包含,没有就补一个关系。建议对照笔记里的例子自己推导一遍,特别注意最后补出来的 R4 的码是不是候选码本身。这个算法几乎每年期末都考,值得花半小时练熟。
5. 函数依赖、闭包计算与 SQL 高频考点:背熟模板就能拿分
5.1 属性闭包的完整求解流程
属性闭包是判断函数依赖是否成立、求解候选码、验证无损连接的工具,笔记里给了完整算法。我把它的执行步骤拆成一个可直接套用的模板:
输入:属性集 X,函数依赖集 F 输出:X+(X 的属性闭包) 算法: result := X while (result 发生变化) do for each 函数依赖 β → γ in F do if β ⊆ result then result := result ∪ γ end if end for end while逻辑说明:循环的核心动作是把“左边已被闭包覆盖”的函数依赖的右边属性吸收进来,直到一轮循环下来闭包不再增长为止。注意 while 的退出条件不是遍历完 F,而是“result 不再变化”,因为一轮遍历可能只吸收部分依赖,吸收后又触发新的依赖条件。举例验证:R(A,B,C,G,H,I),F = {CG→H, CG→I, A→B, A→C, B→H},求 (AG)+。初始 result = AG,第一轮:A→B 使得 result = AGB,A→C 使得 result = AGBC;第二轮:CG→H 使得 result = ABCGH,CG→I 使得 result = ABCGHI;第三轮无变化,输出 ABCGHI。这说明 AG→BCI 成立,因为 BCI 全部落在 (AG)+ 里。这个例子建议自己手写一遍,考试时闭包计算题基本就是这个难度。
5.2 求候选码的标准流程
候选码的求法完全可以机械化操作。我的习惯是分三步:第一步把所有属性分成四类——只在函数依赖左边出现的(L 类)、只在右边出现的(R 类)、两边都出现的(LR 类)、两边都不出现的(N 类);第二步先把 L 类和 N 类属性并起来求闭包,如果闭包已经是全集,那候选码就是从 L∪N 里去掉冗余属性后的最小集合;如果闭包不是全集,再往 L∪N 里逐个加入 LR 类属性尝试。这里有个笔记没细说但考试常考的结论:L 类和 N 类属性必定属于任何一个候选码,R 类属性必定不属于候选码。记不住就自己推一遍——候选码要能推出所有属性,而 R 类属性自己只能被推出来、推不出任何别人,放进去是冗余;L 类属性不被任何依赖推导,所以任何候选码都必须含它。
5.3 SQL 模糊查询与转义字符
SQL 这部分笔试重点考语法细节。先说模糊查询,笔记给了产品和转义字符的套路:%匹配零或多个字符,_匹配单个字符;如果要匹配文本里的%或_本身,用 escape 定义转义字符。笔试真题喜欢出这种:查询产品编号中含 4 个字符以上,且倒数第 3 个字符是 d、倒数第 2 个字符是下划线的产品信息:
select * from PRODUCT where P# like '%_d\__' escape '\'逻辑说明:%匹配前缀任意长度;_匹配倒数第 3 个位置的那个字符,这里记为_前面一个 d;第二个_是真正的任意字符;\__中第一个_被 escape 转义,表示文本中的下划线字面值,第二个_表示最后一个任意字符。参数说明:escape '' 声明反斜杠为转义符,这样\_匹配的就是普通下划线而不是通配符。注意通配符优先级——如果不用 escape 而写成 '%d_',反而匹配不到真正带下划线的产品编号,因为_会被当作单字符通配符处理。
5.4 子查询的三种形式与存在量词
子查询高频考点集中在 in、some/all、exists、unique 四个关键字。in 是集合成员资格判断,等价于 =some;some 要求表达式的值至少与子查询结果的一个值满足比较关系;all 要求与所有值都满足;exists 判断子查询结果集是否有元组存在;unique 判断是否没有重复元组。我的经验是:涉及“至少”的用 some,涉及“比所有都…”的用 all,涉及“是否存在”的用 exists。带子查询的插入和删除要会写,期末常考的是把“删除所有位于 New York 分行的账户”翻成 delete:
delete from account where branch_name in ( select branch_name from branch where branch_city = 'New York' );逻辑说明:先在内层查出 New York 分行的分支名集合,外层删除所有分支名落在这个集合里的账户。注意这里用 in 而不是 =,因为子查询可能返回多行;如果内层确定只返回一行,用 = 也行,但考试默认用 in 更保险。参数说明:where branch_name in (子查询) 里的列名要和子查询 select 的列名对应,这个例子两边都是 branch_name,但如果外层表也有同名列,建议写成 account.branch_name 显式限定。
5.5 视图与物化视图的辨析
视图的定义要背熟:视图是从基本表导出的虚表,物理上不存在,只存储定义,每次查询都要重新计算,视图之上可以再定义视图。物化视图则是把视图的计算结果实际存储起来,相当于 cache,查询更快但需要维护一致性。选择题喜欢出“以下关于视图说法正确的是”,错误的选项一般说“视图占用存储空间”或“视图可以索引”——记住这两条我上面说的本质区别就行。创建视图的语法是 create view v as <查询表达式>,删除是 drop view v。
5.6 事务 ACID 与完整性约束的答题模板
事务的 ACID 四性要能说出每个性质分别由什么机制保证,这个考点几乎每年必出。原子性由恢复机制实现,一致性由应用程序员负责并借助完整性机制协助实现,隔离性由并发控制机制实现,持久性由恢复机制实现。注意原子性和持久性都涉及“恢复机制”,但一个是“回滚撤销”,一个是“故障后重放”,答题时要把这点差异写出来。完整性约束的四种形式也要列全:主码约束(如 S# CHAR(4) PRIMARY KEY)、外码约束(FOREIGN KEY 参照某个主码,可选 ON UPDATE CASCADE/SET NULL/RESTRICT)、非空约束(NOT NULL)、基于属性的检查子句(CHECK)。外码约束的三种策略——CASCADE(级联)、SET NULL(置空)、RESTRICT(拒绝)——选择题常考,注意 RESTRICT 是拒绝父表删除或更新,不是“什么都不做”。
6. E-R 模型转换与无损分解:两道大题的最稳解法
E-R 图转关系模式这部分,笔记给了一个非常实用的口诀体系,我按考试场景重新组织了优先级。一对多联系:把单方的码加入多方实体作为外码,比如“一个班级有多个学生”,班级码加入学生表。多对多联系:联系变成新关系,属性是参与双方的码,比如“学生选课”,选课表包含学号和课程号。一对一联系要看参与度:双方都部分参与,联系定义为新关系;一方全体参与,把另一方的码作为全体参与一方的属性。这个判断是选择题重灾区,原因是一对一联系不像一对多、多对多那样有固定套路,必须看谁“完全参与”。
复合属性、多值属性、派生属性的处理也有固定套路。复合属性拆开并入实体表,生日拆成年、月、日。多值属性单独建新关系,包含原实体的码加上多值属性本身。派生属性不存储,查询时计算。弱实体集用双矩形表示,转换时要把它所依赖的强实体的码并入弱实体表做主码的一部分。
无损分解判定我平时做题只用三步:第一步计算 R1∩R2;第二步分别验证 R1∩R2 是否为 R1 或 R2 的超码——验证方法是求闭包,看能不能覆盖 R1 或 R2 的全部属性;第三步只要有一个成立,分解就是无损的。注意“交是某个子关系的超码”这个条件比“交包含某个子关系的所有属性”更强,很多同学把这两个搞混。举一个笔记里的例子:输入 R1(ABC DEF),F = {AB→D, C→E, AB→C, C→F},候选码是 AB。先处理 C→E,把 R1 拆成 R1(ABCDF) 和 R2(CE);再处理 C→F,R1(ABCD) 和 R2(CEF)。最后验证:R1∩R2 = C,C 在 R1 里不是超码,因为 C+ = CEF,不含 ABD,所以这个分解不是无损的。这种题考试一定会出,而且不会只考一步验证,所以平时要多练多轮分解的中间过程。
7. 考前把这些点再过一遍,高分的把握会大很多
复习这份 PDF 最后阶段,我建议你把重心放在两个最容易失分也最容易通过练习拿满的地方:范式判断和无损连接分解。范式判断的题型非常固定,拿到一个关系模式和一组函数依赖,第一步写候选码、第二步找非码属性、第三步逐个检查每个函数依赖的左边和右边,按笔记那个小表格套结论即可。无损连接分解的题型则依赖闭包计算的熟练度,建议把笔记里的两个算法在纸上完整推导三遍。我自己辅导过的同学里,能把闭包计算做到一眼看出几轮循环的,范式题基本不丢分。
另外一个小技巧是,把 SQL 的每种功能对应的语句类型记成一张表:CREATE/ALTER/DROP 归 DDL,SELECT/INSERT/UPDATE/DELETE 归 DML,GRANT/REVOKE 归 DCL——选择题的送分题,一分都不能丢。视图、物化视图、外键约束策略各花十分钟过一遍关键词,选择题基本能拿下。关系代数和 SQL 的互译要多练,熟练之后你会发现它们本质是同一道题的不同写法而已。
这份 PDF 最大的价值是把散落在教材各章的重点拉成了一条线,但我提醒一句:它毕竟是知识点汇总,不是真题集,计算题的熟练度还是要靠专题练习。从那以后我每次复习数据库都会强制走一遍固定流程——先默写三级模式和 ACID 的定义,再做三组闭包计算,最后做一道完整的范式判断——坚持下来比反复翻书有效得多。希望帮到你。
本文还有配套的精品资源,点击获取