ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

软考数据库系统工程师:关系代数核心考点与解题全攻略

软考数据库系统工程师:关系代数核心考点与解题全攻略 距离软考数据库系统工程师考试还有一段时间的时候总有人问我关系代数到底怎么学教材翻来翻去就那几页选择、投影、连接、除运算看起来也不复杂可一到真题就懵尤其是那些带“全部”“至少”“没有”字眼的查询题完全不知道从哪里下手。我备考时也踩过不少坑后来帮别人答疑慢慢总结出一套比较靠谱的拆解方法。这篇就把关系代数的核心考点掰开揉碎讲一遍重点讲清楚那些让你丢分的地方并给出一套可以直接用的解题流程从基础概念到除运算再到自然语言翻译成表达式的实战套路一次性理清。1. 为什么关系代数看着容易做题却总在细节上翻车1.1 关系代数在软考里的三种常见考法软考数据库系统工程师对关系代数的考查上午题和下午题各有侧重。上午是单选题喜欢考“结果长什么样”给两个关系R和S告诉你各自的属性个数和元组数然后问笛卡尔积、自然连接、投影之后各是多少列多少行。这类题看起来是在考计算实际上考的是你对集合操作的底层理解。下午的案例分析题则直接让你写关系代数表达式比如“查询选修了全部课程的学生的姓名”没有选项可猜只能靠平时积累的表达功底。还有一种考法是“翻译题”。给一段SQL问哪个关系代数表达式和它等价或者反过来给一个关系代数表达式问它对应什么语义。这种题每年都会出现本质上还是考察几个基本运算是否真的理解。很多人选择、投影背得熟一到自然连接和除运算就漏细节往往就是在这类题上丢分。另外上午题还喜欢考“两个表达式是否等价”。例如σ条件作用于连接之后是否可以先做选择再做连接投影和选择是否可以交换顺序。如果只是死记结论碰到具体关系很容易判断错。后面我会专门讲清楚这些等价变换的条件。1.2 丢分最多的三个基础性错误第一个错误把选择条件和投影列混在一起。比如查“CS系中年龄大于20的学生的姓名”有人写成π(sname, sdeptCS)(Student)把布尔条件塞进投影的属性列表里。投影π只负责取列选择σ才负责过滤行这是两个维度的操作不能混在一个运算符里。正确写法是π(sname)(σ(sdeptCS AND sage20)(Student))。第二个错误忘了投影会去重。这是关系代数和SQL最容易起冲突的地方。关系代数的关系是一个集合集合里不可能有重复元组所以π(sno)(SC)的结果中每个学生只出现一次哪怕他在SC里有十条选课记录。但SQL里SELECT sno FROM SC默认输出的是多集会有重复行。很多上午题就专门在这里挖坑问投影结果有几个元组你用SQL的习惯去数必错。第三个错误把等值连接和自然连接当成一回事。等值连接的结果包含两个关系的所有列如果有同名列会出现两列同名自然连接则把同名属性合并为一列。这个差别直接影响了结果列数也影响后续操作的属性引用。很多综合题里明明应该用自然连接的地方先用等值连接最后投影时就找不到那个同名列了。2. 五大基本运算逐个拆解选择、投影、笛卡尔积、并、差2.1 选择σ筛选行结果模式不变选择的符号是σ右下角写条件括号里放关系。比如σ(sage20)(Student)就是从Student表里取出年龄大于20的全部行。选择操作的结果模式和原关系一模一样属性个数不变只是元组被过滤掉一部分。条件内部可以用∧表示“且”∨表示“或”¬表示“非”这些逻辑连接词和编程语言里的AND、OR、NOT是一个意思。选择里最容易犯的错是条件中写了不存在的属性名。比如给的是选课表SC(sno, cno, grade)你写σ(credit3)(SC)但credit在Course表里不在SC表里这个表达式就是非法的。另外在涉及多表连接后如果两个表都有相同属性名引用时一定要加上关系名前缀比如Student.sno SC.sno否则会造成歧义考试题里经常把这个作为判断对错的关键点。选择还有一个特性可以进行条件合并。σF(σG(R))等价于σ(F AND G)(R)这个知识点虽然简单但上午题偶尔会考而且它也是后面查询优化“选择合并”的基础。在写复杂表达式时我习惯把多个条件先合到一起减少运算步骤最后再考虑能否下推到某个表上。2.2 投影π选列顺便给你去重投影的符号是π右下角写属性列表括号里是关系。比如π(sname, sno)(Student)结果只保留sname和sno两列。投影结果里如果出现了完全相同的元组会自动合并成一条。这个去重是集合语义自带的不需要额外写什么DISTINCT。于是考试里经常出现这种题SC表里有一个学生选了5门课问π(sno)(SC)有几行答案是1行不是5行。投影另一个考点是属性顺序。π(sname, sno)(Student)结果的属性顺序是sname在前sno在后和原表属性顺序无关。有的题目会让你写出结果模式如果你按原表顺序写就会丢分。还有一点投影后如果属性列表里包含了两个同名的属性需要先通过重命名区分否则无法表达。投影和选择经常组合使用。口诀是先选择缩小行数再投影取列。虽然理论上先投影后选择也可以但受属性限制如果选择条件用到的属性没有包含在投影列表中就必须先选择再投影。所以标准动作是先σ后π这也是后面讲“选择下推”时的基本套路。2.3 笛卡尔积×一切连接的基础笛卡尔积的符号是×。R×S的结果是R的每个元组和S的每个元组做全组合。假设R有m个属性、p个元组S有n个属性、q个元组那么R×S有mn个属性、p*q个元组。上午题特别喜欢考这个计算公式很简单但要注意别把属性和元组弄反。实际查询中很少直接使用笛卡尔积因为中间结果太大绝大多数场景最终会被选择条件过滤掉。考试里也经常用“必须先做笛卡尔积再选择”来讲述连接的由来所以不难看到题目先考你R×S的结果列数和行数再让你结合选择条件算出最终结果。笛卡尔积有一个隐藏坑如果R和S中有同名属性结果里会出现两个同名列引用时必须写成R.A、S.A。这样做的结果就是无法直接用属性名区分。解决它的办法是重命名或者直接使用自然连接。因此在写表达式时如果两个表有共同属性我通常会用连接而不是笛卡尔积加选择既是语义更清晰也能减少列数。2.4 并∪、差−与相容性集合运算先查户口并、差、交三种集合运算要求两个关系必须相容。相容的意思不是表名相同而是属性个数相同并且对应属性取自同一个域。比如R(A, B)和S(A, C)虽然属性个数都是2但B和C域不同就不能直接做并运算。考试里常给一张学生表、一张教师表问这两个关系能不能做并答案是不能因为属性结构不一致。并运算R∪S的结果是把R和S的元组放到一起再去重。计算元组数时不能简单相加要先看两个集合有多少重复元组。差运算R-S的结果是“在R中出现但不在S中出现的所有元组”。方向很重要R-S跟S-R一般完全不同。交运算R∩S表示同时在R和S里出现的元组它可以用基本运算推导出来R∩S R-(R-S)。这个推导式上午题偶尔会让判断可以在草稿纸上画两个圆理解非常直观。这三种运算在中文查询题里对应“或”“非”“且”比如“选了数据库或选了操作系统的学生”用并“没选任何课程的学生”用差“既选了C1又选了C2的学生”用交。看到“没有”“从未”这类否定词第一反应就是差运算。2.5 重命名ρ自连接里的无名英雄重命名运算符是ρ。ρ(S, A1, A2, ...)(R)可以把关系R改名为S同时把属性也改成新名字。很多初学者会忽略它但考试中大量“自己跟自己比”的查询都要靠它。比如要查“课程表中哪些课程的先修课是它自己”或者“至少选修了课程C1和课程C2两门课的学生”如果不给同一张表重命名就没办法同时引用它的两个不同实例。我说一个记忆技巧自连接的本质是复制一份一模一样的表然后让两个副本进行比较。为了不让属性名冲突必须给其中一个副本改名。重命名之后引用属性要带上新的关系名比如SC1.sno、SC2.sno。上午题如果给你一个表达式里面出现了SC1和SC2你就要能立刻反应过来它是在做自连接通常对应的是“至少”“不同于”这类含义。重命名还有一个用途让两个关系拥有同名属性从而触发自然连接。比如两个表Semester(sno, cname)和Schedule(sno, cname)本来属性名可能不同但通过重命名把公共属性统一自然连接就不需要手写连接条件了。这个技巧在下午题书写时能省不少事。3. 连接运算三兄弟θ连接、等值连接、自然连接3.1 为什么自然连接不是等值连接的简写连接运算看似简单其实有三个容易混淆的变体。θ连接是最一般的形式表达式是R⋈(F)S其中F是任意连接条件结果包含R和S的所有列同名列会同时保留。等值连接是θ连接的特例连接条件只包含等号比较比如R.BS.B结果同样包含两个关系的全部列。自然连接形式上不需要写连接条件它自动找出两个关系的所有同名属性在这些属性上做等值连接并且把这些同名属性合并成一列。自然连接和等值连接的关键区别就在这自然连接多了一步“消除同名列”。举个例子Student(sno, sname)和SC(sno, cno)做等值连接条件是Student.snoSC.sno结果有4列sno, sname, sno, cno。如果做自然连接结果只有3列sno, sname, cno。两个结果的行数可能一样但模式不同。很多同学在写表达式时不注意区分默认就写自然连接。如果题目给出的两个关系公共属性不叫同一个名字比如Student(sid, sname)和SC(sno, cno)那么它们根本找不到同名属性自然连接会退化成笛卡尔积。所以写之前必须先确认公共属性是不是同名。如果不同名要么先重命名要么用θ连接加明确条件。3.2 用一个例子算清列数变化假设Student表有5个属性sno, sname, ssex, sage, sdeptSC表有3个属性sno, cno, grade。两表只有sno同名。这时Student×SC8列。等值连接(Student.snoSC.sno)8列sno会出现两次。自然连接7列sno只保留一次后面接sname, ssex, sage, sdept, cno, grade。上面这个“53-17”的算法在上午题里是高频考点。如果两个关系有多个同名属性自然连接结果列数就是两个属性个数之和减去同名属性个数。比如R(A,B,C)和S(B,C,D)自然连接后是A,B,C,D不是6列而是4列。这类题基本不需要算记住公式就行。还有一个延伸如果两个关系没有任何同名属性自然连接结果就是笛卡尔积。这听起来反直觉但确实是自然连接的定义——在空集属性集合上做自然连接找不到等值条件只能把所有元组配对。题目如果问“两个关系自然连接会不会没有结果”答案不是空集而是回到全配对。3.3 悬浮元组与连接语义的取舍自然连接是内连接只有两边都匹配上的元组才会出现在结果里。假如SC表里有一个学生学号在Student表中不存在自然连接后这个学生的所有选课记录都会消失。这在语义上是合理的因为你查“学生选课信息”时查不到那些没有学生主信息的记录。但在实际数据处理中这种“悬浮元组”被丢弃往往会造成统计偏差。考试里也出现过类似的题先求自然连接再对结果做统计问某些学号的记录为什么少了。正确思路是先意识到自然连接做了内连接过滤而不是怀疑数据出错。如果你想保留那些不匹配的记录关系代数里需要外连接但外连接不是软考关系代数部分的重点最多作为扩充概念提一下掌握到能判断“什么时候该用自然连接、什么时候会被过滤”就够了。连接操作的执行顺序也值得注意。多表连接时先把哪两张表连起来效率差别很大。理论上关系代数不关心执行顺序但考试中的查询优化题喜欢让你判断σ(cnoC1)(SC)和Student自然连接比先Student和SC连接再做选择哪个中间结果小答案显然是先对SC做选择。这就是“先选择后连接”的优化原则。4. 除运算凭什么最难从定义到“候选值-失败组合”法4.1 除运算的直观意义如果让我选关系代数里最抽象的一个运算我会选除运算。它的符号是÷表达式是R÷S。使用条件是S的非空属性集合是R属性集合的子集。结果关系的模式由R中那些不在S里的属性组成。听起来绕通俗讲就是找出R中哪些“实体”和S中所有的元组都产生过对应组合。举最经典的例子SC(sno, cno)除以Course(cno)得到的就是选修了全部课程的学生学号。为什么因为SC包含了“学生-课程”的对应关系Course包含了所有课程除法的意思就是对每个学生检查他是否和Course里的每门课程都形成过选课记录。如果全部存在这个学生就出现在结果里。再举一个更简单的例子。R(sno, cno)有数据a选了c1、c2、c3b只选了c1c只选了c2。S(cno)是{c1, c2}。R÷S的结果应该只有一个学号a。因为a同时有c1和c2两条记录b没有c2c没有c1。这个例子很适合手算你可以把R看成一个小矩阵横向是学号纵向是课程除运算就是看哪些行能覆盖S中所有课程。4.2 用基本运算推导除运算公式除运算虽然看起来高深但它可以用基本运算表达出来这个推导式也是理解除法的钥匙R÷S πX(R) − πX((πX(R)×S) − R)其中X是R的属性减去S的属性后剩下的属性集合。以R(sno, cno)、S(cno)为例X就是{sno}。公式分四步理解πX(R)取出所有候选学号比如{a, b, c}。πX(R)×S把每个候选学号和S中的每个课程全组合生成完整的“候选学生-课程”配对表。这个完整配对表减去R找出哪些配对在真实选课表里不存在。例如b和c2这个配对在R里没有所以它会出现在这里。把这些“失败组合”投影到X得到有失败记录的候选学号用全部候选学号减去这些失败学号剩下的就是每一步都配对成功的学号。你可以把“候选值-失败组合”当心算法。每道除法题先列出候选值再看每个候选值缺不缺S中的某些元组只要缺一个就淘汰。这个心算法比公式更直观也不容易出错。考试中你不需要默写公式但理解公式能帮你解释为什么某些表达式是错的。4.3 除运算典型真题拆解来看一道高频下午题已知Student(sno, sname, ...)、Course(cno, cname, ...)、SC(sno, cno, grade)查询“选修了全部课程的学生姓名”。很多人的第一反应是拿SC整体去除以Course整体但这会出问题。Course的属性有cno、cname、cpno、credit而SC里只有cno和sno、gradecname不在SC中除法使用条件不成立。正确的做法是先把两个关系投影成干净的形式T1 π(sno, cno)(SC)T2 π(cno)(Course)然后计算 T1÷T2得到选修全部课程的学号集合T3。接着再和Student自然连接T4 Student ⋈ T3最后投影snameπ(sname)(T4)。完整表达式是π(sname)(Student ⋈ (π(sno, cno)(SC) ÷ π(cno)(Course)))。两个易错点都在投影被除数的SC不能带grade除数的Course不能带cname。如果带上前者结果模式会多出grade学生可能因为不同成绩而出现多条如果带上后者除法的属性集不是SC的子集直接非法。除运算还有一个常见变式查询“至少选修了课程C1和课程C2的学生”。这种题不需要Course表可以构造一个有两条元组的除数S(cno){(C1), (C2)}然后SC投影后除以它。如果不想用除运算用两个选择的交也可以后面第5章我会专门讲这个等价写法。5. 把中文查询题翻译成关系代数的五步流程5.1 五步拆题法做关系代数综合题最忌讳的是拿起笔就写。我习惯按五步拆解第一步抓“动词”。题目里如果出现“列出”“显示”“查询”说明外层常常是投影π出现“筛选”“满足条件”对应选择σ出现“和/或/否”对应集合运算∪、−、∩出现“全部”“每个”大概率对应除运算。动词决定了表达式的骨架一上来就能排除一半错误。第二步圈“名词”。把题目涉及的表全部圈出来看查询结果需要哪些属性这些属性分布在哪些表里。比如“学生姓名”在Student“课程编号”在Course或SC。如果结果属性和条件属性不在同一张表那就必须通过连接把它们串起来。第三步找量词。这是最容易丢分的地方。“至少”“全部”“所有”“没有”“从未”都是信号词。“全部”对应除“至少”可能是除或交“没有”基本是差。把信号词和运算符对应好等于把题目从中文翻译成了逻辑表达式。第四步判断是否需要自连接。如果题目出现“至少两门不同课程”“两位不同的教师”这样的表述十有八九要复制一份关系并通过重命名区分。这个动作忘记几乎做不出正确结果。第五步写完后反查。查每个属性名是否存在查结果列是否有多余属性查自然连接是否让同名列只剩一列查选择条件引用属性时是否加了必要的表名前缀。这一遍检查花不了两分钟但能捞回不少分。下面用三个真实风格的综合题把这个流程走一遍。5.2 实例一“查询选修了全部课程的学生的姓名”题目里出现“全部”优先考虑除运算。结果为“姓名”姓名在Student表条件和全部课程有关涉及SC和Course。于是被除数是π(sno, cno)(SC)除数是π(cno)(Course)。除法得到学号集合再和Student自然连接得到完整学生信息最终投影sname。完整表达式π(sname)(Student ⋈ (π(sno, cno)(SC) ÷ π(cno)(Course)))。这里有一个细节Student和除运算结果共同的属性是sno所以自然连接可行。如果你写成等值连接就需要额外写清Student.sno 结果.sno而结果关系名一般是未命名的不如自然连接干净。因此只要公共属性同名且想要合并列我就直接用自然连接。验证方式可以对照SQL用SELECT sno FROM SC GROUP BY sno HAVING COUNT(DISTINCT cno) (SELECT COUNT(*) FROM Course)查出学号再连Student。如果表达式算出的学号和这段SQL一致基本可以确认正确。这种交叉验证在平时练习中很有用。5.3 实例二“查询至少选修了C1、C2两门课程的学生学号”“至少”在这里不是全部课程而是指定课程集合。题目只给了C1、C2两个课程编号不需要Course表参与。有三种等价写法。第一种用除运算构造一个临时的除数关系S(cno)包含两行(C1)和(C2)然后π(sno, cno)(SC) ÷ S(cno)。第二种用交运算查选了C1的学生集合和选了C2的学生集合取交集。表达式为π(sno)(σ(cnoC1)(SC)) ∩ π(sno)(σ(cnoC2)(SC))。第三种用自连接把SC复制成两份一张表选C1另一张选C2然后按学号相等连接。三种写法都成立考试时选自己最熟悉、最不容易写错的那种。如果题目是“至少选修了两门课程”而不是指定的两门那就不能用固定C1、C2了。这时需要自连接把SC复制为SC1和SC2条件是学号相同但课程号不同然后投影学号。表达式的核心是σ(SC1.snoSC2.sno AND SC1.cno≠SC2.cno)(SC1×SC2)再投影sno。这一步要特别注意课程号不等条件否则会把同一课程的两条记录也当成两门课。5.4 实例三用差运算表达否定查询再看“查询没有选修任何课程的学生姓名”。这里“没有”的否定语义对应差运算。一个人的名字要想出现在结果里前提是他从未出现在选课表SC中。先取Student全部学号π(sno)(Student)再取SC中出现的全部学号π(sno)(SC)两者相减得到没选任何课程的学号π(sno)(Student) − π(sno)(SC)。然后连接Student投影姓名π(sname)(Student ⋈ (π(sno)(Student) − π(sno)(SC)))。要注意的是相减前两个操作数必须模式一致所以都对sno投影。如果有人直接写Student − SC这是非法的因为Student和SC属性个数不同无法做差。很多人到了这一步还反应不过来其实想想集合运算“相同模式才能比较”这个前提就懂了。同理“一门课都没挂过的学生”这种否定题也可以转化为“所有成绩都≥60的学生”或者“存在成绩60的学生”取补集。当你会用差运算表达“没有”之后这类题基本都能做。关键是先把“存在的集合”找出来再用全体减去它。6. 关系代数与SQL的对照理解越深写SQL越稳6.1 一条SELECT语句对应一组关系代数算子很多同学是先会SQL后学关系代数觉得后者只是理论。实际上关系代数是SQL的“编译目标”数据库执行一条SELECT时内部就会生成一棵由选择、投影、连接等算子组成的查询树。把两者的对应关系理清楚对写SQL和理解优化器都有帮助。对应关系大致是SELECT 列对应πFROM 多表对应笛卡尔积或连接WHERE 条件对应σUNION对应∪EXCEPT对应−INTERSECT对应∩JOIN...ON对应θ连接NATURAL JOIN对应自然连接。GROUP BY和HAVING在基本关系代数里没有直接对应所以涉及“分组后计数”的查询关系代数表达起来比较吃力一般会借助除法或自连接来替代。这个对照关系在考试里的直接价值是遇到一条很复杂的SQL先在草稿纸上写出它的关系代数骨架再回过来看SQL能快速定位多表连接时少了什么选择条件。比如SELECT sname FROM Student, SC WHERE Student.snoSC.sno AND SC.cnoC1翻译成关系代数就是π(sname)(σ(cnoC1)(Student ⋈ SC))写出来之后你很容易发现先对SC做选择再连接比先连接再选择效率更高这也是优化器常用的等价变换。6.2 等价变换与查询优化思路考试喜欢考这样一类题给定两个关系代数表达式让你判断是否等价。其中最经典的是选择下推和投影下推。选择下推σF(R⋈S)等价于(σF(R))⋈S但前提是F中引用的属性都属于R或者都属于S如果F同时引用了两个表的属性比如R.AS.A那就不能下推因为它本身就是连接条件。这个规则背后的思路很朴素先把一组数据过滤到更小再与其他表连接中间结果会小很多。投影下推πL(R⋈S)可以先对R和S分别投影但必须保证连接属性还在投影列表中。比如Student⋈SC公共属性是sno如果你想先投影Student为π(sname, sno)(Student)那没问题因为sno和sname都在但如果投影列表里没有sno后续就没法做连接了。考试里经常用这种题考你对连接属性是否敏感。还要记住选择和投影的交换限制。πL(σF(R))如果想改写成σF(πL(R))前提是F用到的所有属性必须包含在L里。如果F用了sdept而L里只有sname交换后条件就找不到属性了。所以标准策略永远是把σ放在最内层、π放在外层除非题目专门让你讨论可交换性。6.3 用关系代数检查SQL逻辑的正确性这个习惯是我在实际项目里养成的。有一次接手别人写的多表报表SQL数据总是对不上肉眼扫过去看不出哪里不对。我把SQL翻译成关系代数后发现他用了普通的等值连接但两张表存在一对多的父子关系导致某个指标被重复累计。如果直接用SQL纠错可能要一行行看数据但用关系代数看连接后的集合语义一下就明白了一对多连接会让父表数据复制到每一个子记录上后续再聚合就会放大。在备考阶段你也可以用这个思路验证自己的表达式。写完一个除法表达式不确定对错时把关系代数翻译成SQL去执行或者反过来把SQL执行结果和关系代数手算结果对比。多来几次你对每个运算的语义会越来越敏感。特别是除运算很多人觉得它抽象一旦用SQL里的GROUP BY加COUNT(DISTINCT cno)对照马上就知道结果长什么样了。7. 考前最后的自查考点清单、两道演练、一点心得7.1 高频考点自查清单到了考前冲刺阶段不建议再抱着书从头翻。我给自己列过一张关系代数的自查表每条都能快速回答才敢说基本准备到位。第一五个基本运算的定义和符号要能默写并且知道交、连接、除都可以用基本运算推导。第二两个关系能做并差交的前提是模式相容属性个数相同且域对应这个条件有90%的上午题会绕一下。第三自然连接和等值连接的列数区别要会算。第四看到“全部”“至少”“没有”能立刻映射到除、交/除、差。第五σ和π的交换需要满足什么条件。第六自连接怎样通过重命名实现。第七选择下推能省多少资源等价表达式怎么变形。如果这些条目里有任何一条需要想半天就说明它还处于模糊状态。不要去刷大量新题先回到对应章节把那条概念吃透再找三五道针对性题目巩固效果比盲目刷题好得多。7.2 两道限时演练给你两道适合考前限时训练的题每道控制在五分钟内。第一道上午题风格有关系R(A, B, C)和S(B, C, D)两个关系的所有元组均不相同。求R和S自然连接的结果属性列表并说明如果是等值连接条件为R.BS.B AND R.CS.C结果属性列表是什么。答案自然连接结果属性是A, B, C, D共4列等值连接结果是A, B, C, B, C, D共6列。这里最容易写错的是把自然连接后面追加S.D忘记B、C合并。第二道下午题风格已知Student(sno, sname)、Course(cno, cname)、SC(sno, cno)写出“查询没有选修任何课程的学生的学号和姓名”的关系代数表达式。参考答案π(sno, sname)(Student ⋈ (π(sno)(Student) − π(sno)(SC)))。注意差运算两侧必须是同模式所以不能直接Student−SC最终和Student连接时公共属性sno能够触发自然连接结果只保留学号、姓名两列正好符合题意。7.3 我备考关系代数时的一点经验最后分享一个我自己用过的笨办法。每天找三道中文查询题先不急着看答案把每道用自然语言重写一遍明确它的动词、名词和量词再转换成关系代数表达式最后用SQL验证一次。这个流程坚持两周效果会非常明显。到考试后期我只要看到“全部”两个字脑子里能立刻反射出“被除数、除数、候选值、失配候选值”这一整条链看到“没有”就自动想“全体减去存在集合”。还有一个小技巧考试答题时尽量把中间结果另起一行写出来不要全部挤在一行。比如先写T1π(sno,cno)(SC)再写T2π(cno)(Course)最后写T1÷T2。这样就算最终表达式有一点错误阅卷时也能看到你的思路帮你拿到步骤分。关系代数的本质是把集合操作拆成清晰的步骤你写得越清楚得分的机会就越大。
返回列表