软考数据库系统工程师:关系代数核心考点与解题全攻略
距离软考数据库系统工程师考试还有一段时间的时候总有人问我关系代数到底怎么学教材翻来翻去就那几页选择、投影、连接、除运算看起来也不复杂可一到真题就懵尤其是那些带“全部”“至少”“没有”字眼的查询题完全不知道从哪里下手。我备考时也踩过不少坑后来帮别人答疑慢慢总结出一套比较靠谱的拆解方法。这篇就把关系代数的核心考点掰开揉碎讲一遍重点讲清楚那些让你丢分的地方并给出一套可以直接用的解题流程从基础概念到除运算再到自然语言翻译成表达式的实战套路一次性理清。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。这样就算最终表达式有一点错误阅卷时也能看到你的思路帮你拿到步骤分。关系代数的本质是把集合操作拆成清晰的步骤你写得越清楚得分的机会就越大。

相关新闻

多目标优化驱动冷热电联供系统运行:CCHP调度实战解析

多目标优化驱动冷热电联供系统运行:CCHP调度实战解析

“这个电价下,光靠燃气轮机跟吸收式溴化锂配合,很可能比不过‘电制冷燃气锅炉’的常规路子!”——这是我第一次把完整冷热电联供(CCHP)模型跑通、拿到初步帕累托前沿时,对着合伙人说的第一句话。做综合能源…

2026/10/3 18:13:06 阅读更多 →
冷热电联供系统多目标优化实战:NSGA-II建模与调参全记录

冷热电联供系统多目标优化实战:NSGA-II建模与调参全记录

做综合能源系统优化这几年,冷热电联供(CCHP)一直是我觉得最有嚼头的方向。单个设备的热力计算不难,但把燃气轮机、余热锅炉、吸收式制冷机、电制冷机、储能装置捏成一个整体,再让它同时满足冷、热、电三种负荷的需求&a…

2026/10/3 18:13:06 阅读更多 →
MySQL连接与SQL查询优化:从握手到执行计划的完整排查指南

MySQL连接与SQL查询优化:从握手到执行计划的完整排查指南

干后端这几年,MySQL 的日常工作中我听到最多的两句话,一句是“连不上数据库了”,另一句是“这条 SQL 怎么这么慢”。表面上看这是两个独立的问题,一个发生在连接阶段,一个发生在查询阶段,但如果你把从连接数…

2026/10/3 18:13:05 阅读更多 →

最新新闻

Python+SQL全栈实战:高考志愿填报参考系统源码解析

Python+SQL全栈实战:高考志愿填报参考系统源码解析

简介:这是一套面向高考考生、家长及教育信息化开发者的志愿填报参考系统源码,基于Python与Django构建Web服务,可按高校城市、高考排名、高校层次、专业等条件检索匹配的院校与专业信息,帮助使用者快速定位志愿填报方向。资源包共1…

2026/10/3 18:55:45 阅读更多 →
Hadoop伪分布式搭建与电商商品推荐实战

Hadoop伪分布式搭建与电商商品推荐实战

简介:本资源是一套基于Hadoop生态构建的轻量级商品推荐系统实践项目,面向大数据初学者、高校课程设计学生及分布式计算入门开发者,聚焦电商场景下的用户行为分析与个性化推荐落地。项目依托HDFS分布式存储与MapReduce批处理框架,完…

2026/10/3 18:55:45 阅读更多 →
浏览器端跑YOLO:视觉质检的端侧化工程实践

浏览器端跑YOLO:视觉质检的端侧化工程实践

去年年底接了一个视觉质检项目,客户的要求很直接:检测画面不能出车间,最好连服务器都别装。我当时的第一个念头是这活儿得靠边缘盒子,但现场一看,产线工位上连工控机都是临时凑的,更别说部署什么边缘计算设…

2026/10/3 18:55:45 阅读更多 →
微信内置浏览器抓包实战:ADB与Chrome远程调试全攻略

微信内置浏览器抓包实战:ADB与Chrome远程调试全攻略

有一次我需要排查微信内置浏览器里某个H5页面的接口请求,Fiddler代理、装证书、手机连WiFi代理都试了一遍,结果发现微信里打开任意网页全部白屏,而系统浏览器和第三方App却都能正常走代理。当时第一反应是证书没装对,折腾了半小时…

2026/10/3 18:55:45 阅读更多 →
AI应用底座QuickBlue:打通企业大模型落地的最后一公里

AI应用底座QuickBlue:打通企业大模型落地的最后一公里

1. 先搞明白:QuickBlue 是什么?最近帮几家企业做 AI 落地选型,几乎每一家都问同一个问题:大模型选哪个?我通常会反问一句:你打算怎么把大模型接进现有的 CRM、ERP、工单系统里?然后话题就会转移…

2026/10/3 18:55:44 阅读更多 →
RK3588安卓系统预装输入法内置指南:从mk文件到实战踩坑

RK3588安卓系统预装输入法内置指南:从mk文件到实战踩坑

1. 同样是"预装",为什么有的输入法出厂后却"消失"了 做RK3588安卓方案开发的朋友,大概率都遇到过这种情况:给客户演示样机的时候,把设备恢复出厂设置,结果预装的第三方输入法没了,或者…

2026/10/3 18:54:44 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →