AIGC标识 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 等语句背后的逻辑。

posted @ 2026-10-28 16:45  渡solong~  阅读(7)  评论(0)    收藏  举报