
简介华南师范大学《数据库》期末复习知识点汇总以 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 输出XX 的属性闭包 算法 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 AGBA→C 使得 result AGBC第二轮CG→H 使得 result ABCGHCG→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 是集合成员资格判断等价于 somesome 要求表达式的值至少与子查询结果的一个值满足比较关系all 要求与所有值都满足exists 判断子查询结果集是否有元组存在unique 判断是否没有重复元组。我的经验是涉及“至少”的用 some涉及“比所有都…”的用 all涉及“是否存在”的用 exists。带子查询的插入和删除要会写期末常考的是把“删除所有位于 New York 分行的账户”翻成 deletedelete 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→FR1(ABCD) 和 R2(CEF)。最后验证R1∩R2 CC 在 R1 里不是超码因为 C CEF不含 ABD所以这个分解不是无损的。这种题考试一定会出而且不会只考一步验证所以平时要多练多轮分解的中间过程。7. 考前把这些点再过一遍高分的把握会大很多复习这份 PDF 最后阶段我建议你把重心放在两个最容易失分也最容易通过练习拿满的地方范式判断和无损连接分解。范式判断的题型非常固定拿到一个关系模式和一组函数依赖第一步写候选码、第二步找非码属性、第三步逐个检查每个函数依赖的左边和右边按笔记那个小表格套结论即可。无损连接分解的题型则依赖闭包计算的熟练度建议把笔记里的两个算法在纸上完整推导三遍。我自己辅导过的同学里能把闭包计算做到一眼看出几轮循环的范式题基本不丢分。另外一个小技巧是把 SQL 的每种功能对应的语句类型记成一张表CREATE/ALTER/DROP 归 DDLSELECT/INSERT/UPDATE/DELETE 归 DMLGRANT/REVOKE 归 DCL——选择题的送分题一分都不能丢。视图、物化视图、外键约束策略各花十分钟过一遍关键词选择题基本能拿下。关系代数和 SQL 的互译要多练熟练之后你会发现它们本质是同一道题的不同写法而已。这份 PDF 最大的价值是把散落在教材各章的重点拉成了一条线但我提醒一句它毕竟是知识点汇总不是真题集计算题的熟练度还是要靠专题练习。从那以后我每次复习数据库都会强制走一遍固定流程——先默写三级模式和 ACID 的定义再做三组闭包计算最后做一道完整的范式判断——坚持下来比反复翻书有效得多。希望帮到你。本文还有配套的精品资源点击获取