关系代数核心考点:从基本运算到除运算与查询优化

发布时间:2026/10/1 17:54:39
关系代数核心考点:从基本运算到除运算与查询优化 关系代数这个知识点放在数据库系统工程师考试里地位有点既基础又致命。上午的选择题它会出下午的案例设计题它更是绕不开。但我见过太多考生背会了σ、π、⋈这些符号一看到综合题就懵尤其是除运算和自然连接连连看能画对写表达式却驴唇不对马嘴。这篇内容就是围绕关系代数核心考点把命题逻辑、操作语义、做题套路和避坑点一次说清。不管你是刚翻开教材的新手还是刷题卡壳的老考生都能从中找到能直接上手的解题路径。数据库系统工程师上午题里关系代数的分值不算最高但它是性价比很高的一块概念明确、符号固定、套路有限一旦掌握失分概率极低。更关键的是它会影响你对SQL、查询优化、范式理论的理解类似搭房子时的地基。本文不搞教材式照本宣科我从一个老考生的角度把重点考点重新捋一遍再配上例题和踩坑记录希望帮你真正把这块硬骨头啃下来。1. 先从几个典型的丢分点说起读懂命题套路1.1 为什么关系代数总在会与不会之间很多考生的真实状态是课本翻过好几遍符号也认识但做题时仍然拿不准。问题通常出在记住符号和理解语义之间有一条鸿沟。比如σ和π都是单目运算一个选行一个选列看起来简单但放在嵌套表达式里谁先执行、结果关系长什么样、属性列如何变化很多人就乱了。另一个典型丢分点是自然连接和等值连接的区别考试不会直接问你定义而是给两个关系让你判断连接结果有几列、有几行这时候死记定义就废了。所以我一直认为关系代数的复习不能靠背要靠画。把每个运算符看成对表的一次操作心里有一张动态的表格结果自然就出来了。这也是为什么很多科班老师反复强调关系代数是过程化语言你要像执行程序一样一步步推演结果。看到题目第一件事不是写答案而是在草稿纸上画出两个关系标好属性列和数据行再逐步操作。1.2 命题者的高频出题方式从历年真题来看关系代数主要围绕四个方向出题掌握这些命题切入点复习起来才不会像无头苍蝇。方向一基本运算语义辨析。给出关系R和S判断某个表达式的执行结果比如σ age20(π name(S)) 表示先投影再选择还是先选择再投影虽然选择与投影满足交换律是需要条件的但命题人会挖坑比如选择条件引用的属性是否在投影结果中。方向二等价改写。把除运算写成基本运算、把自然连接写成等值连接加投影、把嵌套查询改写为连接。这类题直接考你对运算定义的把握。方向三结果计算。给定具体元组求连接结果的行数、列数、某个选择后的结果集合这也是最需要细心的一类。方向四与SQL的转换。上午题偶有下午题常出现。给定一个SQL查询目标让你写关系代数表达式或者反过来给关系代数表达式说SQL语义。表格可以帮大家快速定位考点与难度出题方向常见考查形式难度系数对应章节运算语义表达式等价判断⭐⭐第2、4章等价改写除转基本运算⭐⭐⭐⭐第3章结果计算连接行列数判断⭐⭐⭐第2、4章SQL转换表达式互转⭐⭐⭐第5章注意上表中的难度系数是我个人基于真题统计的主观感受主要用来帮大家分配时间并非官方标准。2. 关系代数地基五种基本运算一次讲透2.1 关系与元组先搞清操作对象关系代数操作的对象是关系通俗点讲就是一张二维表。表的每一行叫元组每一列叫属性。这可不是废话因为后面所有运算的规则都由这个结构决定。比如选择运算 σ 产生的结果依然是一张表它的模式也就是属性集合与原关系完全一样。投影运算 π 的结果模式则是原关系属性集合的子集。理解这一点有什么用用来判断两个表达式是否等价。例如 π A,B (σ C1(R)) 和 σ C1(π A,B(R))第二个表达式里的选择条件引用了C但投影结果里根本没有C这种情况下不能交换。类似的坑在考试中反复出现根源就是没搞清操作结果的关系模式。另一个容易忽视的概念是元组本身或者说行在关系中的唯一性。理论上关系是集合不允许重复元组。但实际数据库表可以存在重复行投影运算因为有去重语义结果可能会让行数变少。这个细节在计算题里会直接影响答案。我们后面在集合运算那里再细说。2.2 选择与投影行与列的裁剪选择运算 σ 公式为 σ_条件(R)作用是从关系R中选出满足条件的元组相当于横向裁剪不改变列。比如 学生成绩表 有学号、课程号、成绩三列要查询成绩大于90的记录就可以写作 σ 成绩90(选课表)。条件里可以用比较运算符 、、、≥、≤、≠也可以用逻辑运算符 ∧、∨、¬ 组合多个条件。投影运算 π 语法是 π_属性列表(R)作用是只留下指定的列并进行去重。比如 π 学号,课程号(成绩表) 返回的是每个学生每门课的选课情况如果同一个学生同一门课有多条记录投影后只保留一条。这里要注意投影去重是关系代数的内在语义很多题目考的就是去重是否发生。投影还有一个坑属性列表的顺序可以不遵循原表顺序。π 课程号,学号(...) 得到的结果列顺序是课程号在前这在判断结果时往往无关紧要但如果题目要求你写出结果表应按题目指定的属性顺序写尽量保持与原题一致避免被扣过程分。实际操作中选择和投影经常嵌套使用。比如查询年龄大于20的学生姓名可以先 σ 年龄20(学生) 再 π 姓名也可以反过来吗反过来需要保证条件属性在投影中保留所以 σ 年龄20(π 姓名,年龄(学生)) 可以但 π 姓名(σ 年龄20(学生)) 更直观且更高效。考试时如果遇到等价改写题建议先把两边的属性列都列出来再比较结果模式是否一致不要凭感觉。2.3 笛卡尔积与连接表是怎么拼起来的笛卡尔积是二目运算符号是 ×表示两个关系的所有元组两两组合。如果R有m行、n个属性S有k行、j个属性结果就有m×k行nj列。这个运算本身是暴力拼接理论上会产生大量冗余数据实际查询中很少直接用但它是连接运算的基础。连接运算 ⋈ 实际上是在笛卡尔积之上施加一个条件等于先×后σ。例如 R ⋈_{R.A S.A} S 就是从R和S的笛卡尔积中选出满足R.A等于S.A的元组。这种带条件的连接叫θ连接θ可以是任意比较运算符。当条件为等值比较时叫等值连接。如果两个关系的连接属性名称相同并且把重复的属性列去掉就叫自然连接。考试特别喜欢考自然连接的结果行列数。假设R(A,B,C)有三行数据S(B,C,D)有四行数据并且R中的B、C值与S中的B、C值重叠情况不同自然连接结果的行数是两个关系在公共属性B,C上取值一致的元组组合数。很多人想当然按笛卡尔积的行数算或者按等值连接的行数算都容易错。自然连接和等值连接的区别是自然连接在连接后会自动去掉重复的公共属性列。如果题目问连接后有几列自然连接的列数是两者列数之和减公共属性数等值连接则是两者列数之和。比如R有3列S有4列公共属性是2个自然连接结果是5列等值连接结果是7列。这个考点年年有务必记牢。2.4 集合运算并、交、差别只背符号并运算 ∪、交运算 ∩、差运算 要求两个关系必须是并兼容的也就是属性个数相同且对应属性的类型一致考试常假设属性相同。并运算将两个元组合并去掉重复交运算是取同时出现在两个关系中的元组差运算是取属于第一个关系但不属于第二个关系的元组。集合运算和SQL中的 UNION、INTERSECT、EXCEPT 对应。这个考点不算难但有个容易忽略的坑当涉及投影去重时并运算的结果行数可能不是简单相加。比如R有2行S有3行其中1行完全相同R∪S结果是4行不是5行。做题时最好把两个关系的元组都列出来逐个打勾别用公式硬套。交和差的关系也要理清R∩S R(RS)这个等价式偶尔会出现在选择题中。别看它简单确实有不少人绕不过来。考试不会直接问这些定义而是会问下列哪个表达式等价于R∩S。3. 重点中的重点除法运算的底层逻辑与解题套路3.1 除运算到底是干什么的除运算符号是 ÷是关系代数里考试区分度最高的知识点。它的语义是包含所有。举个例子已知选课表S(学号,课程号)课程表C(课程号)要查询选了所有课程的学生的学号用除法写就是 S ÷ C。这里被除数S是选课记录除数C是课程列表商就是每个学生所选的课程集合中包含全部课程的那些学生。理解这个语义比记公式重要十倍。很多人在考场上把除法的操作步骤背混但只要你能把题目翻译成包含所有再对照基本运算去推就很难出错。除运算的适用场景非常典型查询全部所有至少等字眼。比如选修了张三老师开设的全部课程的学生参与了所有项目的员工。这类题在数据库工程师考试下午题中也经常出现用SQL可能需要双层NOT EXISTS但关系代数用除就非常简洁。3.2 一步步拆解除法的计算过程假设R有属性集合X和YS只有Y属性R÷S的结果是一个只含X属性的关系表示R中那些在Y属性上包含了S中全部Y值的X值。动手计算时我习惯用分组对照法分三步走第一步找共同属性。设R的属性分为两部分X部分结果要保留的属性和Y部分共同属性。S的属性必须等于Y部分或包含Y属性。考试题一般设计为S就是Y属性。第二步按X值分组。把R中所有元组按照X的值分组同一组代表同一个实体。第三步逐一检查组内Y值是否完全覆盖S中的Y值。只有全覆盖的分组其X值才进入结果。举个例子。R(A,B) 有元组(a1,b1),(a1,b2),(a1,b3),(a2,b1),(a2,b2)S(B) 有元组(b1,b2)。这里XAYB。分组后a1对应的B集合是{b1,b2,b3}完全覆盖Sa2对应{b1,b2}也覆盖S。因此 R÷S 结果是A的两个值a1,a2。如果把S改为{b1,b2,b3}那么只有a1满足条件a2因为缺少b3被排除。这个例子来自常见教材重点不是答案而是你能否理解覆盖的含义。考试如果给出更复杂的表格按这个流程一步步来基本不会错。3.3 除运算的等价改写技巧用基本运算表示考试有一种题型是不直接考除法而是问下列哪个表达式等价于R÷S。这时候你需要掌握一个通用的改写公式R÷S π_X(R) π_X(π_X(R) × S R)这个公式看起来很吓人其实一句话解释在R的X投影中去掉那些没能覆盖S全部Y值的X值。 但直接记公式容易错我建议记住推导过程先构造所有可能的X值和S的组合π_X(R) × S表示每个X值都配上所有S中的Y值。这是一个理想情况如果某个X值覆盖全部S那么这个X值在R中出现。用这个理想情况减掉R得到的是缺失的X-Y组合。对这些缺失组合只投影X得到的就是没有覆盖全部S的X值。最后用全部X值减去这些不合格X值自然就得到合格X值。考试中如果你不记得公式完全可以按这个逻辑推通常推一次只需要几分钟比死记要稳。3.4 考试中的典型题与易错点常见题型一给两张具体表求除法结果。这种题最简单按分组对照法操作即可但注意结果中的属性列名是什么不要多写列。常见题型二给四个关系代数表达式选等价于除法的那个。这就需要用等价改写公式判断。此类题要特别小心 π_X(R) × S R 这一步很多选项故意把 π_X(R) 写成 R那就会把X值以外的其他列也带出来导致差运算的属性不一致一眼就能排除。易错点方面最典型的是没有注意X部分可能包含多个属性的情况。比如R(A,B,C)S(B,C)求 R÷S 的结果是A值但分组时要把(A)作为整体分。有些考生误以为把A和B分别投影结果就乱了。还有一个易错点是空集情况。如果S为空关系按集合论里除法的定义R÷S 结果是R的X投影的所有值。考试如果出现空集一般是为了考你定义理解看到空集不要慌。4. 连接家族进阶自然连接、θ连接、左外连接怎么选4.1 各种连接的区别与适用场景把连接运算放在一起比较是考试特别偏爱的方式。我给它们排个序笛卡尔积 → θ连接 → 等值连接 → 自然连接每一步都是在上一步基础上做约束或去重。自然连接是最特殊的一种它要求公共属性名相同自动比较相等并去掉重复属性。以下面两张表为例R(A,B,C) 有 (1,2,3)、(4,5,6)S(B,C,D) 有 (2,3,7)、(5,6,8)、(2,9,10)。如果做自然连接需要公共属性B、C都相等R的第一行 (1,2,3) 的B2,C3与S的第一行 (2,3,7) 匹配拼出 (1,2,3,7)。R的第二行 (4,5,6) 的B5,C6与S的第二行 (5,6,8) 匹配拼出 (4,5,6,8)。S的第三行 (2,9,10) 的B2,C9与R的任何一行都不匹配不出现在自然连接结果中。再加上R.A、S.D两个非公共属性结果两列四行。如果换成等值连接 R⋈_{R.BS.B} S结果行可能是R每行与S中B相等的行组合这里R两行的B分别是2和5S有三行B分别为2、5、2组合起来是2行不是两行R第一行B2可以和S第一行B2、S第三行B2组合但S第三行C9匹配后结果是(1,2,3,2,9,10)有效R第二行B5可以和S第二行B5组合。所以等值连接结果共3行列数为6列。这个差别就是自然连接去掉重复列带来的。4.2 外连接在试卷里的常见考法外连接符号通常写作 ⟕左外、⟖右外、⟗全外在教材中可能用 ⋉ 之类表示但考试一般会在题目中说明符号含义。左外连接等于自然连接的结果加上左侧关系中未匹配的元组右边填NULL。考试中关于外连接的题常混合在自然连接结果的计算里。如果题目问保留学生表中没有选课的学生怎么写表达式自然想到 π 学生表所有属性, 成绩(...) 配合左外连接。解题关键是未匹配元组的公共属性列如何填值结果的行数等于自然连接匹配的行数加未匹配的行数。注意不要和外连接、右外连接的方向搞混。左外保留左边全部右外保留右边全部。如果题目没有特殊说明默认连接是自然连接不带NULL填充。外连接一般会在题干里明确提示。4.3 如何快速判断连接条件选择题里经常给一句话查询每个学生及其选课情况要求不遗漏没选课的学生。看到不遗漏左边就用左外连接。如果只说查询学生选课情况没有强调不遗漏就用自然连接或等值连接即可。判断连接条件的方法我总结了一口诀相同属性看语义去重列数算自然等值条件看点名不带名字是笛卡儿。翻译一下连接条件相等且属性名相同时优先考虑自然连接如果明确指出 R.学号 S.学号 之类条件则用等值连接没有任何连接条件的组合就是笛卡尔积。至于用 θ连接还是等值连接等值连接是θ连接的特例题目给的是本质一样只是自然连接多了去重。做题时建议在草稿纸上把两个表的属性名都写出来标出公共属性再决定用哪种连接。宁可慢一点也别凭感觉。5. 关系代数表达式优化上午题和下午题都会考5.1 为什么要优化SQL执行的直觉理解查询优化在考试中的理论地位很高但大部分考生觉得它抽象。其实可以这样理解关系代数表达式就是查询方案数据库执行时可以按这个方案一步步处理。同样的查询方案不同执行代价天差地别。比如先笛卡尔积再选择中间数据会爆炸先选择再连接数据量可能小很多。考试常考的优化策略本质上就是让操作更早地缩小数据量。选择和投影都缩小数据规模所以原则上应该尽量先做选择、再做投影然后做连接。这不是一句空话下午题偶尔会让你写优化的关系代数表达式上午题会让你判断哪个表达式执行效率最高。5.2 等价变换规则记忆口诀关系代数的等价变换规则有很多条考试最常出现的是以下几条选择与投影的交换σ_F(π_attrs(R)) ↔ π_attrs(σ_F(R))需要满足条件F只涉及投影中的属性。选择与选择的串接σ_F(σ_G(R)) σ_F∧G(R)可以把多个选择合并。选择与笛卡尔积的交换σ_F(R×S) 可以推出 σ(R) × σ(S)前提是F能拆分到R和S上。投影与笛卡尔积的交换π(R×S) 可以推出 π1(R) × π2(S)。连接的结合律和交换律。这些规则不需要死记我常跟人讲把它们归纳成三个动作下推选择、下推投影、合并选择。选择下推的目的是提前过滤投影下推的目的是提前裁列合并选择是为了减少扫描次数。考试时只要你看到表达式里有 R×S 然后外面套选择优先想能不能把选择下推。看到连接前有投影想能不能缩小连接前的关系。5.3 典型优化步骤示范举一个非常经典的优化例子。查询表达式π_学号,姓名(σ_系别计算机 ∧ 成绩90(学生 ⋈ 选课))。看到这个表达式先别急着执行。先观察σ的条件包含两个表的不同属性系别来自学生成绩来自选课。所以可以把选择拆开、下推先把 σ_系别计算机(学生) 和 σ_成绩90(选课) 分别执行再进行连接。连接后再做投影就能避免先做大连接再过滤。优化后的表达式写出来就是π_学号,姓名(σ_系别计算机(学生) ⋈ σ_成绩90(选课))这样执行时连接的数据量被大幅缩小。考试中如果题目要求画出查询树你要体现出选择下推这一步。上述例子就是步骤示范不必死记答案关键是理解每一步为什么能推。5.4 从关系代数到SQL的映射思路下午题里常出现用关系代数表达式表示以下SQL查询或者反过来。核心映射关系其实很简单SELECT 子句里的列 → 投影 πWHERE 子句里的条件 → 选择 σFROM 后多个表 → 笛卡尔积/连接GROUP BY / HAVING → 一般关系代数不直接支持但可以先用选择投影处理完再用聚合考试极少考到这一步NOT EXISTS / IN 嵌套 → 除运算或差运算给你一个强烈建议遇到这种转换题先写中文语义再写关系代数。比如SQL是查询选了所有课程的学生的姓名先翻译为学生表中存在某个学号该学号在选课表中的课程集合包含全部课程再写成 π_姓名(学生 ⋈ (选课 ÷ 课程))。虽然这种题不一定直接考但这个思路能让你在做优化题时更有全局观。6. 真题实战三道典型题一步步推演6.1 选择投影结合类真题思路题目设关系R(A,B,C)S(B,C,D)下列哪个表达式的执行效率通常更高A. π_A,D(σ_R.BS.B ∧ R.CS.C(R×S)) B. σ_R.BS.B ∧ R.CS.C(π_A,R.B,R.C,S.B,S.C,D(R×S)) C. π_A,D(σ_R.BS.B(R)×σ_R.CS.C(S)) D. π_A,D(σ_R.BS.B ∧ R.CS.C(π_A,R.B(R) × π_S.B,S.C,D(S)))这道题快速判断A先做笛卡尔积再选择再投影中间表很大B先投影但选择条件中的公共属性保留在投影结果里可以接受但选择仍然在投影之后且投影后仍要比较R.B和S.B实际可行C把选择拆到两个关系上再笛卡尔积是标准优化思路D最后连接后再投影但两个子投影没有去掉与连接无关的列效率不如C。综合选C。题目本身不难但帮大家理清思路看到表达式中有R×S优先考虑选择下推。这题的陷阱是B看起来也没错但代价不如C小。下午题写优化表达式时也一样先对每个表单独选择、投影再做连接。6.2 除运算类真题解法题目图书借阅表 J(学号,书号)图书表 B(书号,书名)求借阅了全部图书的学生学号。关系代数表达式写为 π_学号(J ÷ π_书号(B))。注意这里除数是全部书号而不是整个B表因为如果写成 J ÷ B除数包含书名与J只有书号不兼容。很多人第一反应写 J ÷ B这就是错点。解这个题时用分组法验证J中学号分组某学生的书号集合如果等于全部书号集合就符合条件。实际考试中如果给你具体表格你仍然可以用三个基本公式推一遍确认最后的结果列只有学号不会出现书号列。6.3 连接集合运算综合题解法题目设R(A,B)S(A,B)其中R有元组(1,2),(2,3),(3,4)S有元组(2,3),(3,4),(5,6)。求 R÷π_B(S) 的结果。关键是不能直接除因为除数π_B(S)的值是 {3,4}而R中B值有{2,3,4}这里的语义是求R.A中那些对应的B集合包含{3,4}的A值。先看A1B集合{2}不包含A2B集合{3}缺少4不包含A3B集合{4}缺少3不包含。所以结果是空关系。如果是这种题只需一步步检查不要因为结果为空就怀疑自己。这类综合题往往混合了投影、除法、集合运算。解题时把每一步中间结果列在草稿纸上哪怕最后结果是空也要保证过程严谨。7. 常见问题与备考建议实录7.1 新手最容易掉的坑结合我给考生答疑的经验整理出几个高频问题也是大家复习时最容易踩的坑。第一搞混投影结果没有某属性却还用它做选择的问题。这个坑在上面提过这里再强调一次写嵌套表达式必须时刻清楚每一步结果的属性模式。可以先在表达式右侧用注释标出当前结果的属性列表。第二自然连接结果列数算错。请反复练一个动作两个关系列数相加再减去公共属性数。遇到多个公共属性也要逐个减。第三把差运算和除法混为一谈。查询没有选修任何课程的学生用差π_学号(学生) π_学号(选课)。而选修了全部课程的学生用除。这两个语义非常像但一个是集合减法一个是包含判断。考试如果把这些概念放在一道题里先判断到底是没有还是全部。第四集合运算结果不兼容时还在硬算。并、交、差运算的两个关系属性必须完全一致。如果R(A,B)、S(B,C)想直接 R∪S 是错的必须先投影对齐属性。这个考点看似基础却在真题中反复出现。7.2 教材没明说但考试会用的小技巧考试中不少题型可以有秒杀级的判断方式。比如看到除运算先看除数是不是一个单属性关系。如果不是先对除数做投影。这个动作要形成肌肉记忆。再比如看到至少两个字十有八九会用除运算看到全部往往需要差运算配合。这个对应关系来自自然语言和关系代数语义的映射准确率很高。还有一个小技巧关系代数表达式等价判断时可以给关系设置最简单的一组数据一两行即可然后分别求两个表达式的结果看是否一致。这不是考试答题过程但作为检查手段非常高效。考场上如果时间充裕拿一个一行或两行的假数据验算能避免低级错误。7.3 两周速成关系代数的自测清单如果你现在做题还经常卡壳我建议用两周时间做一次强度递进的训练。第一周每天做十道基本运算计算题只做选择、投影、连接、集合运算的纯计算不碰混合题目标是准确率到90%以上。第二周每天做三道综合题把除运算和外连接混合进去。完成后按下面的清单自测能否在不出错的前提下写出 R÷S 的等价基本运算表达式能否口算出两个三列关系做自然连接后的列数和大致行数能否在一分钟内将给定的SQL查询每个学生选了所有课程改写为除运算表达式能否画出简单查询树并指出选择下推的位置能否准确判断一个关系代数表达式与另一个是否等价如果以上五项都能达到数据库系统工程师上午题里关系代数相关的内容基本可以稳拿分了。我个人备考时最大的感触是不要高估记忆也不要低估练习。关系代数感一旦建立你可以越做越顺甚至成为拿分强项。希望这篇总结能帮你少走一些我走过的弯路到考场上做到心中有数。