输入关系
先从保存选课记录的 SC 开始
输入、处理、输出
选择运算,并说清每个中间结果有哪些列、每行代表什么
筛选 SC 得到 \(R_1\),保留 Sno 得到 \(R_2\);如果结果非空则继续连接 Student
SC→筛 81002→取 Sno→连 Student→取 Sname先从保存选课记录的 SC 开始
筛选课程号、保留学号、匹配学生姓名
每一步都产生一个关系,能够交给下一步
\(R_1\) 作为投影的输入,\(R_2\) 作为连接的输入
是集合运算还是关系运算?是基本运算还是导出运算
并、差、交、笛卡儿积从元组集合出发;选择、投影、连接、除还会使用条件或属性
并、差、笛卡儿积、选择、投影是基本运算;交、连接、除可由它们表达
选择是“专门且基本”,连接是“专门且可导出”;两条分类轴彼此独立
并、差、交的两个输入必须属性数相同、对应位置同域
两个关系具有相同的属性数
相应位置的属性来自同一个域
保留相应属性结构;不要求属性名相同
合并两份名单、找只在第一份的人、找两份都出现的人
| 运算 | 表达式 | 结果含义 |
|---|---|---|
| 并 | \(R \cup S\) | 属于 \(R\) 或属于 \(S\) 的元组 |
| 差 | \(R - S\) | 属于 \(R\) 而不属于 \(S\) 的元组 |
| 交 | \(R \cap S\) | 同时属于 \(R\) 和 \(S\) 的元组 |
差运算有方向;并、差和交的结果都不改变元组的属性结构
笛卡儿积不要求两个关系相容,\(R\) 的每个元组都与 \(S\) 的每个元组组合
若 \(R\) 有 \(k_1\) 个元组,\(S\) 有 \(k_2\) 个元组,结果有 \(k_1 \times k_2\) 个元组;结果属性数为 \(R\) 与 \(S\) 的属性数之和,同名属性用关系名区分
结果先包含匹配与不匹配的所有行对,通常还要用条件筛掉不需要的配对
选择判断 \(R\) 中每个元组,只保留使 \(F(t)\) 为真的元组
结果保留 \(R\) 的全部属性,只减少元组
Student 关系\(\sigma_{\mathrm{Smajor}=\text{信息管理与信息系统}}(\mathrm{Student})\) 找出符合专业条件的学生
投影只保留指定属性列;取消部分列后,完全相同的元组只保留一次
Student 关系\(\Pi_{\mathrm{Sno},\mathrm{Smajor}}(\mathrm{Student})\) 只保留学号和主修专业
\(\Pi_{\mathrm{Smajor}}(\mathrm{Student})\) 只保留不同的主修专业
先判断要减少行还是减少列
| 运算 | 保留什么 | 典型问题 |
|---|---|---|
| 选择 | 满足条件的元组 | 哪些学生属于信息管理专业 |
| 投影 | 指定的属性列 | 需要显示学生的哪些信息 |
| 选择后投影 | 满足条件的行中的指定列 | 这些学生的学号和姓名是什么 |
连接从候选组合中保留学号匹配的元组
\(t_{\mathrm{Student}} \in \mathrm{Student}\)、\(t_{\mathrm{SC}} \in \mathrm{SC}\) 分别表示两个输入关系中的一行
\(t_{\mathrm{Student}}[\mathrm{Sno}]\)、\(t_{\mathrm{SC}}[\mathrm{Sno}]\) 取出两行中用来比较的学号分量
学号匹配时,把两行的属性串接为更长的结果元组
\(A\)、\(B\) 分别是 \(R\)、\(S\) 中列数相等且值可比较的属性组,\(\theta\) 是比较运算符
\(\theta\) 连接从 \(R \times S\) 中保留满足 \(t_R[A] \,\theta\, t_S[B]\) 的元组;\(\theta\) 为等号时是等值连接
同名属性等值匹配,并删除重复的连接列
某个关系中不存在的属性,往往需要从其他关系取得
没有选课的 Student 或没有学生选修的 Course 成为悬浮元组
| 连接 | 匹配条件 | 结果关注 |
|---|---|---|
Student 与 SC | \(\mathrm{Student}.\mathrm{Sno}=\mathrm{SC}.\mathrm{Sno}\) | 补出 \(\mathrm{Sname}\) |
| 悬浮元组 | 连接条件属性上没有匹配 | 普通自然连接中舍弃 |
| 外连接 | 保留悬浮元组 | 未匹配的属性填入 \(\mathrm{NULL}\) |
无匹配元组是悬浮元组,普通自然连接会舍弃它们;外连接保留悬浮元组
两者都按相等条件匹配,但自然连接还处理重复属性列
| 类型 | 匹配条件 | 结果列结构 |
|---|---|---|
| \(\theta\) 连接 | \(A \,\theta\, B\),\(\theta \in \{>,\ge,<,\le,=,\ne\}\) | 保留两个输入关系的属性列 |
| 等值连接 | \(A = B\) | 保留两个输入关系的属性列 |
| 自然连接 | 同名属性等值匹配 | 删除重复的同名连接列 |
等值连接只按相等匹配;自然连接还删除重复的同名连接列
学生的已修课程象集覆盖全部指定课程时,该学生进入结果
\(R\) 与 \(S\) 中参与比较的属性组列数相等、对应位置同域;属性名可以不同
固定 \(x\),\(Y_x = \{t[Y] \mid t \in R \land t[X] = x\}\)
若 \(\Pi_Y(S) \subseteq Y_x\),则 \(x\) 进入结果 \(P\)。例如目标集合为 \(\{y_1,y_2\}\) 时,只有象集同时包含 \(y_1\) 和 \(y_2\) 的 \(x\) 入选
“全部”决定了查询不能只筛选其中一门课程
\(K(\mathrm{Cno}) = \{81001,81003\}\)
\(R(\mathrm{Sno},\mathrm{Cno}) = \Pi_{\mathrm{Sno},\mathrm{Cno}}(\mathrm{SC})\)
\(R \div K \to P(\mathrm{Sno})\)
只保留同时拥有 \(K\) 中两门课程的 \(\mathrm{Sno}\);\(P(\mathrm{Sno}) = \{20180001,20180002\}\)
每一步先给结果命名,再写清它保留哪些列以及其中一行代表什么
SC\(R_1 = \sigma_{\mathrm{Cno}=81002}(\mathrm{SC})\),模式与 SC 相同,表示选修 81002 的记录
\(R_2(\mathrm{Sno}) = \Pi_{\mathrm{Sno}}(R_1)\),表示这些记录中的学生学号
Student\(R_3 = R_2 \Join \mathrm{Student}\),按同名 Sno 匹配,模式与 Student 相同
\(R_4(\mathrm{Sname}) = \Pi_{\mathrm{Sname}}(R_3)\),得到最终姓名关系
只要学号不连 Student;需要姓名按 Sno 连接;要求“全部”再检查象集覆盖
| 业务问题 | 核心运算 | 结果说明 |
|---|---|---|
| 选修 81002 的学生学号 | 选择、投影 | 只保留满足条件的 \(\mathrm{Sno}\) |
| 选修 81002 的学生姓名 | 选择、投影、连接 | 将 \(\mathrm{Sno}\) 与 \(\mathrm{Student}\) 组合 |
| 同时选修 81001 和 81003 | 分别选择并投影两门课程的 \(\mathrm{Sno}\),再求交 | 只保留两次结果共有的 \(\mathrm{Sno}\) |
| 选修全部指定课程 | 投影、除;若要姓名再连接 | 除先得到象集覆盖全部课程的 \(\mathrm{Sno}\) |
任选“集齐道具的玩家”或“买齐指定商品的用户”,画中间表并合成表达式
列出需要的关系和属性,判断是否需要相容关系、匹配条件或目标集合
用 \(R_1,R_2,\ldots\) 记录每一步保留的行、列或组合,并写出结果模式
写出中间结果的一行代表哪个玩家、用户、道具或商品;遇到“全部”时,明确谁拥有的集合必须包含哪份要求清单
给中间结果表命名,写列和行的含义,把 \(R_1,R_2,\ldots\) 合成关系代数表达式
Smajor 后要去重?