关系代数(Relational Algebra)是关系型数据库理论的基础之一,它提供了一组操作,用于从一个或多个关系(即数据库中的表)中提取和处理数据。这些操作本质上是一种查询语言,通过对关系的操作生成新的关系,类似于 SQL 中的查询语句。关系代数的每个操作都是针对关系的,操作的结果也是一个关系。
关系代数可以用于表达查询的逻辑运算,是查询执行的理论基础。它使用数学符号和规则来描述数据查询的操作,并且通过这些操作可以组合成更复杂的查询。
1. 关系代数的基本概念
1.1 关系(Relation)
在关系代数中,关系就是表,表由若干个元组(即行)组成,表中的列称为属性。一个关系可以看作一个集合,其中每个元素是一个元组。
1.2 属性(Attribute)
属性是关系中的列,描述了元组中的一个数据点。例如,关系 “学生” 中可能有属性 “学号”、“姓名”、“班级”。
1.3 元组(Tuple)
元组是关系中的一行数据,每个元组由若干个属性的值组成。每个元组的值是不同的属性的具体数据点。
2. 关系代数的基本操作
关系代数中的操作可以分为两类:基本操作和派生操作。基本操作包括选择、投影、并、差、笛卡尔积、重命名,派生操作包括交、自然连接、左外连接等。基本操作是其他操作的基础,任何复杂的查询都可以由基本操作组合而成。
2.1 选择(Selection, σ)
选择操作用于从关系中选取符合某些条件的元组,即按行选择。选择操作的结果是原关系的一个子集。
- 语法: σ 条件 ( R ) \sigma_{条件}(R) σ条件(R)
- 含义:从关系 R R R 中选择满足某个条件的元组。
示例:
假设有一个关系 学生(Student)
,属性为 学号
、姓名
、班级
。
学号 | 姓名 | 班级 |
---|---|---|
101 | 张三 | 一班 |
102 | 李四 | 二班 |
103 | 王五 | 一班 |
选择班级为“一班”的学生:
- σ 班级 = ’一班’ ( 学生 ) \sigma_{\text{班级 = '一班'}}(学生) σ班级 = ’一班’(学生)
结果为:
学号 | 姓名 | 班级 |
---|---|---|
101 | 张三 | 一班 |
103 | 王五 | 一班 |
2.2 投影(Projection, π)
投影操作用于从关系中选择特定的属性,即按列选择。投影操作会删除不需要的列,并去除结果中的重复元组。
- 语法: π 属性列表 ( R ) \pi_{\text{属性列表}}(R) π属性列表(R)
- 含义:从关系 R R R 中选择指定的列(属性)。
示例:
在 学生(Student)
关系中,投影出学生的学号和姓名:
- π 学号, 姓名 ( 学生 ) \pi_{\text{学号, 姓名}}(\text{学生}) π学号, 姓名(学生)
结果为:
学号 | 姓名 |
---|---|
101 | 张三 |
102 | 李四 |
103 | 王五 |
2.3 并(Union, ∪)
并操作用于将两个关系中的所有元组合并,去掉重复的元组。要求两个关系的属性必须相同。
- 语法: R 1 ∪ R 2 R_1 \cup R_2 R1∪R2
- 含义:返回关系 R 1 R_1 R1 和 R 2 R_2 R2 的并集,包含 R 1 R_1 R1 和 R 2 R_2 R2 中所有的元组,重复元组只保留一个。
示例:
假设有两个关系:
关系A:
学号 | 姓名 |
---|---|
101 | 张三 |
102 | 李四 |
关系B:
学号 | 姓名 |
---|---|
102 | 李四 |
103 | 王五 |
执行并操作:
- A ∪ B A \cup B A∪B
结果为:
学号 | 姓名 |
---|---|
101 | 张三 |
102 | 李四 |
103 | 王五 |
2.4 差(Difference, −)
差操作用于返回属于第一个关系但不属于第二个关系的元组。
- 语法: R 1 − R 2 R_1 - R_2 R1−R2
- 含义:返回属于 R 1 R_1 R1 而不属于 R 2 R_2 R2 的元组。
示例:
对于上面的关系A和关系B,执行差操作:
- A − B A - B A−B
结果为:
学号 | 姓名 |
---|---|
101 | 张三 |
2.5 笛卡尔积(Cartesian Product, ×)
笛卡尔积用于将两个关系中的每个元组合并,生成一个包含所有可能组合的新关系。
- 语法: R 1 × R 2 R_1 \times R_2 R1×R2
- 含义:返回 R 1 R_1 R1 和 R 2 R_2 R2 的笛卡尔积,每个元组是 R 1 R_1 R1 的一个元组与 R 2 R_2 R2 的一个元组的组合。
示例:
假设有两个关系:
关系A:
学号 | 姓名 |
---|---|
101 | 张三 |
关系B:
课程ID | 课程名 |
---|---|
201 | 数学 |
202 | 英语 |
执行笛卡尔积:
- A × B A \times B A×B
结果为:
学号 | 姓名 | 课程ID | 课程名 |
---|---|---|---|
101 | 张三 | 201 | 数学 |
101 | 张三 | 202 | 英语 |
2.6 重命名(Rename, ρ)
重命名操作用于为关系或其属性赋予新的名字,以方便理解或解决关系代数表达式中的属性名冲突问题。
- 语法: ρ 新名 ( R ) \rho_{新名}(R) ρ新名(R)
- 含义:将关系 R R R 重命名为 新名 新名 新名。
示例:
假设有一个关系 学生(Student)
:
- ρ S ( S t u d e n t ) \rho_{S}(Student) ρS(Student)
将 Student
关系重命名为 S
。
3. 关系代数的派生操作
派生操作是基于基本操作构建的更复杂的操作,用于表达更复杂的查询逻辑。
3.1 交(Intersection, ∩)
交操作返回两个关系的交集,包含两个关系共有的元组。
- 语法: R 1 ∩ R 2 R_1 \cap R_2 R1∩R2
- 含义:返回同时属于 R 1 R_1 R1 和 R 2 R_2 R2 的元组。
3.2 自然连接(Natural Join, ⨝)
自然连接是笛卡尔积的一个变体,它结合了选择和笛卡尔积,要求只有相同属性的元组才被连接。
- 语法: R 1 ⋈ R 2 R_1 \bowtie R_2 R1⋈R2
- 含义:根据两个关系中具有相同属性值的列进行连接,去掉重复的列。
示例:
假设有两个关系:
学生表:
学号 | 姓名 |
---|---|
101 | 张三 |
102 | 李四 |
选课表:
学号 | 课程 |
---|---|
101 | 数学 |
102 | 英语 |
自然连接操作:
- 学生 ⋈ 选课 学生 \bowtie 选课 学生⋈选课
结果为:
学号 | 姓名 | 课程 |
---|---|---|
101 | 张三 | 数学 |
102 | 李四 | 英语 |
3.3 外连接(Outer Join)
外连接是自然连接的扩展。它包括左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join),外连接保留了不匹配的元组。
- 左外连接(Left Outer Join):保留左表的所有元组,即使右表中没有匹配的元组。
- 右外连接(Right Outer Join):保留右表的所有元组,即使左表中没有匹配的元
组。
- 全外连接(Full Outer Join):保留左右表的所有元组。
4. 关系代数和 SQL 的关系
关系代数是 SQL 查询语言的理论基础,SQL 的许多操作都可以通过关系代数来描述。比如:
- SQL中的SELECT 对应关系代数中的 选择(Selection, σ)。
- SQL中的JOIN 对应关系代数中的 自然连接(Natural Join, ⨝)。
通过关系代数,可以用数学的形式表达数据库查询逻辑,帮助理解 SQL 语句的执行原理。
总结
关系代数 是关系型数据库理论中的一种操作系统,它使用一组数学操作符对关系(表)进行查询操作。通过选择、投影、并、差、笛卡尔积、重命名等基本操作,关系代数为数据库提供了一个强大的查询工具。复杂的查询可以通过这些基本操作组合实现,理解关系代数对理解 SQL 查询优化和执行至关重要。