3.5 关系代数运算
关系代数运算详解
关系代数是数据库理论的核心基础之一,它用数学化的方式描述对关系(表)的各种操作。本文将逐一介绍关系代数中的基本运算,并配以通俗易懂的样例帮助理解。
一、关系模式
定义: 关系模式可以理解为数据库中的一张表,它描述了表的结构(有哪些列)以及列的含义。在代数运算中,"关系"和"表"这两个概念可以通用。
样例:
假设我们有两张关系(表):
学生表(Student)
| 学号 | 姓名 | 性别 | 年龄 | 班级 |
|---|---|---|---|---|
| 001 | 张三 | 男 | 20 | 一班 |
| 002 | 李四 | 女 | 21 | 二班 |
| 003 | 王五 | 男 | 20 | 一班 |
成绩表(Score)
| 学号 | 课程 | 成绩 |
|---|---|---|
| 001 | 数学 | 90 |
| 002 | 数学 | 85 |
| 003 | 英语 | 92 |
这里的"学生表"和"成绩表"就是两个关系模式。
二、并运算(Union)
定义: 并运算将两张表的所有记录合并在一起,相同的记录只保留一份(去重)。
运算符号: R ∪ S
前提条件: 两张表必须具有相同的属性列(列的结构一致)。
样例:
假设有两张班级花名册:
一班花名册
| 姓名 | 性别 |
|---|---|
| 张三 | 男 |
| 李四 | 女 |
二班花名册
| 姓名 | 性别 |
|---|---|
| 李四 | 女 |
| 王五 | 男 |
并运算结果(一班 ∪ 二班):
| 姓名 | 性别 |
|---|---|
| 张三 | 男 |
| 李四 | 女 |
| 王五 | 男 |
注意:李四在两个表中都出现,但并运算后只显示一次。
三、交运算(Intersection)
定义: 交运算返回两张表中都出现的记录,即取公共部分。
运算符号: R ∩ S
前提条件: 两张表必须具有相同的属性列。
样例:
继续使用上面的两张花名册:
一班花名册
| 姓名 | 性别 |
|---|---|
| 张三 | 男 |
| 李四 | 女 |
二班花名册
| 姓名 | 性别 |
|---|---|
| 李四 | 女 |
| 王五 | 男 |
交运算结果(一班 ∩ 二班):
| 姓名 | 性别 |
|---|---|
| 李四 | 女 |
只有李四同时出现在两张表中,所以交运算结果只有李四。
四、差运算(Difference)
定义: 差运算 R − S 返回在表 R 中存在但在表 S 中不存在的记录。
运算符号: R − S
前提条件: 两张表必须具有相同的属性列。
样例:
一班花名册
| 姓名 | 性别 |
|---|---|
| 张三 | 男 |
| 李四 | 女 |
二班花名册
| 姓名 | 性别 |
|---|---|
| 李四 | 女 |
| 王五 | 男 |
差运算结果(一班 − 二班):
| 姓名 | 性别 |
|---|---|
| 张三 | 男 |
张三在一班但不在二班,所以差运算结果只有张三。注意:差运算是有方向的,一班 − 二班 ≠ 二班 − 一班。
五、笛卡尔积(Cartesian Product)
定义: 笛卡尔积将表 R 中的每一条记录与表 S 中的每一条记录进行组合,生成一张全新的表。新表的属性列是两张表所有属性列的合并,记录数是两张表记录数的乘积。
运算符号: R × S
样例:
班级表
| 班级 | 教室 |
|---|---|
| 一班 | 101 |
| 二班 | 102 |
学生表
| 姓名 | 性别 |
|---|---|
| 张三 | 男 |
| 李四 | 女 |
| 王五 | 男 |
笛卡尔积结果(班级 × 学生):
| 班级 | 教室 | 姓名 | 性别 |
|---|---|---|---|
| 一班 | 101 | 张三 | 男 |
| 一班 | 101 | 李四 | 女 |
| 一班 | 101 | 王五 | 男 |
| 二班 | 102 | 张三 | 男 |
| 二班 | 102 | 李四 | 女 |
| 二班 | 102 | 王五 | 男 |
班级表有 2 行,学生表有 3 行,笛卡尔积结果有 2×3=6 行。属性列也是两张表合并:班级、教室、姓名、性别。
六、投影(Projection)
定义: 投影运算从一张表中选取指定的列(属性),丢弃不需要的列。投影操作不涉及条件筛选,只是单纯地"挑列"。投影可以用列名表示,也可以用列的位置编号表示。
运算符号: π(列名)(R) 或 π(列编号)(R)
样例:
学生表
| 学号 | 姓名 | 性别 | 年龄 | 班级 |
|---|---|---|---|---|
| 001 | 张三 | 男 | 20 | 一班 |
| 002 | 李四 | 女 | 21 | 二班 |
| 003 | 王五 | 男 | 20 | 一班 |
投影操作:π(姓名,班级)(学生表) —— 只取"姓名"和"班级"两列
结果:
| 姓名 | 班级 |
|---|---|
| 张三 | 一班 |
| 李四 | 二班 |
| 王五 | 一班 |
如果用列编号表示:π(2,5)(学生表) 也表示取第2列(姓名)和第5列(班级),结果相同。
七、选择(Selection)
定义: 选择运算根据给定的条件,从一张表中筛选出满足条件的行(记录),所有列都保留。选择操作是"挑行",不是"挑列"。
运算符号: σ(条件)(R)
样例:
学生表
| 学号 | 姓名 | 性别 | 年龄 | 班级 |
|---|---|---|---|---|
| 001 | 张三 | 男 | 20 | 一班 |
| 002 | 李四 | 女 | 21 | 二班 |
| 003 | 王五 | 男 | 20 | 一班 |
选择操作:σ(性别='男')(学生表) —— 筛选性别为男的记录
结果:
| 学号 | 姓名 | 性别 | 年龄 | 班级 |
|---|---|---|---|---|
| 001 | 张三 | 男 | 20 | 一班 |
| 003 | 王五 | 男 | 20 | 一班 |
选择是"按条件挑行",投影是"按列名挑列"。简单记忆:选择管行,投影管列。
八、自然连接(Natural Join)
定义: 自然连接是一种特殊的等值连接,它自动找到两张表中同名且同类型的列(公共属性),然后在这些公共列上取值相等的记录之间进行匹配。结果表中包含两张表的所有属性列,但公共属性列只显示一次(不重复)。
运算符号: R ⋈ S
样例:
学生表
| 学号 | 姓名 | 性别 | 年龄 | 班级 |
|---|---|---|---|---|
| 001 | 张三 | 男 | 20 | 一班 |
| 002 | 李四 | 女 | 21 | 二班 |
| 003 | 王五 | 男 | 20 | 一班 |
成绩表
| 学号 | 课程 | 成绩 |
|---|---|---|
| 001 | 数学 | 90 |
| 002 | 数学 | 85 |
| 003 | 英语 | 92 |
两张表的公共属性列是"学号"。自然连接会在"学号"上匹配值相等的记录:
自然连接结果(学生 ⋈ 成绩):
| 学号 | 姓名 | 性别 | 年龄 | 班级 | 课程 | 成绩 |
|---|---|---|---|---|---|---|
| 001 | 张三 | 男 | 20 | 一班 | 数学 | 90 |
| 002 | 李四 | 女 | 21 | 二班 | 数学 | 85 |
| 003 | 王五 | 男 | 20 | 一班 | 英语 | 92 |
注意:公共列"学号"只显示一次,两张表的其他列全部保留。如果某条记录的学号在另一张表中找不到匹配,则该记录不会出现在自然连接结果中。
九、运算效率
核心原则: 关系代数运算的效率主要取决于参与运算的表的大小——属性列数和记录数越少,运算速度越快。因此,在实际的数据库查询优化中,一个重要的策略是尽早执行选择操作(即在做连接等昂贵运算之前,先用条件把不需要的行过滤掉),从而减少参与后续运算的数据量。
通俗理解:
想象你要把两摞文件配对(相当于连接运算),如果你先把手里不需要的文件扔掉(相当于选择运算过滤),剩下要配对的文件夹就小得多,效率自然高。
样例对比:
假设有 10000 条学生记录和 10000 条成绩记录:
- 低效做法: 先做笛卡尔积(产生 10000×10000 = 1亿条组合),再从这 1 亿条里筛选学号匹配的 → 浪费大量计算资源
- 高效做法: 先用选择运算把需要的学生筛选出来(比如只选一班的学生,可能只剩 2000 条),再做连接运算(2000×10000 = 2000万条组合)→ 计算量大幅减少
总结:先过滤、后连接 是数据库查询优化的黄金法则。
附:各运算速查表
| 运算名称 | 符号 | 操作对象 | 通俗理解 |
|---|---|---|---|
| 并 | ∪ | 两张表 | 合并去重 |
| 交 | ∩ | 两张表 | 取公共部分 |
| 差 | − | 两张表 | 在第一张表但不在第二张表 |
| 笛卡尔积 | × | 两张表 | 每行都跟另一张的每行配对 |
| 投影 | π | 一张表 | 挑列(选某些列) |
| 选择 | σ | 一张表 | 挑行(按条件筛选) |
| 自然连接 | ⋈ | 两张表 | 按公共列自动匹配连接 |
关系代数是 SQL 查询的理论基础。理解了这些基本运算,就能更好地理解 SQL 中 SELECT、FROM、WHERE、JOIN 等语句背后的逻辑。

浙公网安备 33010602011771号