第3章精讲:关系模型与关系代数
第 3 章:关系模型与关系代数精讲
关系代数是 SQL 的"数学原型"。看起来抽象,其实每一种运算都能在 SQL 里找到对应写法。本章先过一遍关系模型术语,再把 7 种运算逐个讲透,最后给出综合题的解题流程。
一、关系模型的术语体系
一张表就是一个关系。逐个对号:
| 术语 | 直观理解 |
|---|---|
| 关系 | 一张规范化的二维表 |
| 元组 | 表中的一行(一条记录) |
| 属性 | 表中的一列(一个字段) |
| 域 | 属性的取值范围 |
| 分量 | 元组在某个属性上的具体值 |
| 候选码 | 唯一标识元组的最小属性集 |
| 主码 | 选定的一个候选码 |
| 主属性 | 出现在任一候选码中的属性 |
| 非主属性 | 不在任何候选码中的属性 |
| 外码 | 引用另一个关系候选码的属性(组) |
关系的性质(选择题):属性名唯一且同质(同列取自同一域);元组不重复;行列次序可以任意交换;每个分量必须是不可再分的数据项(原子性)。最后一条是"规范化二维表"的判据——单元格内不能是"电话1/电话2"这种复合值。
二、传统集合运算(要求相容:属性个数相同且对应域相同)
设有学生 A 班名单 R 和 B 班名单 S(结构相同):
- 并 R ∪ S:两个班所有学生(去重);
- 差 R − S:在 R 中但不在 S 中的学生(只在 A 班);
- 交 R ∩ S:两个班都有的学生;R ∩ S = R − (R − S);
- 笛卡尔积 R × S:把两个任意结构关系的元组两两拼接。结果列数 = 两者之和,行数 = 两者之积。它本身意义不大,但它是"连接"的原料。
三、专门的关系运算(考试核心)
以下用 Student(Sno, Sname, Sdept, Sage) 和 SC(Sno, Cno, Grade) 示例。
1. 选择 σ:按条件挑行(水平切割)
σSdept='计算机' ∧ Sage>20(Student) → 计算机系 20 岁以上的学生行。
SQL 对应:SELECT * FROM Student WHERE Sdept='计算机' AND Sage>20。
2. 投影 π:按列挑取(垂直切割,自动去重)
πSname,Sdept(Student) → 只留姓名、系别两列。
SQL 对应:SELECT Sname,Sdept FROM Student。
3. 连接 ⋈:把两张表按条件拼起来
- θ 连接:R ⋈AθB S,保留满足 θ 条件的拼接行;
- 等值连接:θ 取 =;
- 自然连接:比较同名列相等,且结果去掉重复列——最常用,隐含条件通常是主码 = 外码。
考点:自然连接与等值连接的区别 = 是否去掉重复属性列。
SQL 对应:FROM Student JOIN SC ON Student.Sno = SC.Sno。
4. 除法 ÷:回答"全部/所有"型查询
"查询选修了全部课程的学生学号":
SC ÷ Course。被除关系 SC(X,Y),除数关系 Course(Y),结果取 X 中那些在 SC 中与 Course 的每一个 Cno 都配对过的 Sno。
口诀记牢:题目出现"全部/所有/每一门",答案就是除法。
四、综合题解题流程(背下来)
考题形式:"设有……关系模式,用关系代数写出查询"。
第一步:读题,圈出"查询结果要什么列"和"条件"。
第二步:判断用几张表 → 多表先自然连接(按主外码)。
第三步:套公式组合:
π 输出列 ( σ 条件 ( 表1 ⋈ 表2 ) )
第四步:若条件含"所有/全部",改用除法,外层再套 π。
例题:查询选修了'C02'号课程且成绩大于 80 的学生姓名。
πSname( σCno='C02' ∧ Grade>80(Student ⋈ SC) )
五、自测题
- 候选码和主码的区别是什么?(一个是资格,一个是当选者)
- 自然连接与等值连接的区别?(去不去重复列)
- "查询供应了全部零件的供应商"用什么运算?(除法)
- 投影之后行数会不会变少?(会,因为去重)
下一篇进入全书最重的板块——第 4 章 SQL 之建库建表。
