第五章:关系代数(Relational Algebra)笔记
一、什么是关系代数?
关系代数是一种用于操作关系(表)的数学语言,是数据库查询语言的理论基础。
核心概念:
- 操作对象:关系(即表)
- 操作符:选择、投影、连接、集合运算等
- 目标:用这些操作符构建查询表达式,获取我们需要的数据
二、核心操作符(Core Operators)
操作 | 符号 | 说明 |
---|---|---|
并(Union) | 合并两个关系 | |
交(Intersection) | 取两个关系共有的元组 | |
差(Difference) | 取第一个中有但第二个中没有的元组 | |
选择(Selection) | 筛选满足条件的行 | |
投影(Projection) | 选出指定列,并去重 | |
广义投影(Extended Projection) | 可以进行计算、重命名 | |
笛卡尔积(Product) | 将两个表的所有行组合起来 | |
Theta 连接(Theta Join) | 基于条件 | |
自然连接(Natural Join) | 自动按同名属性等值连接,去掉重复列 | |
重命名(Renaming) | 给关系或属性起新名字 | |
去重(Duplicate Elimination) | 去重,将重复元组合并为一条 | |
排序(Sorting) | 按指定属性排序 | |
分组(Grouping) | 按指定属性分组 |
三、详细讲解每个操作符
1. 选择( )
从一个关系中选出满足条件
示例:
表示从 Sells
表中选出 bar = "Joe's"
的所有记录。
2. 投影( )
从一个关系中选出某些列(属性),并去除重复元组
示例:
从 Sells
表中选出 beer
和 price
列,并去重。
3. 广义投影(Extended Projection)
在投影时可以添加新的列,比如通过计算生成新列,也可以对已有列重命名
示例:
设关系
广义投影:
结果为:
4. 笛卡尔积( )
将两个关系的所有元组进行配对,形成一个新的关系
示例:
注意:如果两个表有相同属性名,需要加前缀区分,如 R1.A
, R2.A
5. Theta 连接( )
先做笛卡尔积,再根据某个条件筛选出符合条件的元组
示例:
相当于先做乘积,再选 bar
相同的记录。
6. 自然连接( )
自动按照相同名称的属性进行等值连接,并自动去掉重复列
示例:
系统会自动按 bar
字段连接,并只保留一份 bar
列。
7. 重命名( )
给关系或属性起新名字,常用于避免列名冲突
示例:
将 Bars(name, addr)
重命名为 R(bar, addr)
8. 去重( )
去重,将重复元组合并为一条
9. 排序( )
按指定属性排序
四、构建复杂表达式的方法
1. 使用赋值语句
2. 嵌套表达式
3. 表达式树(Expression Tree)
图形化表示查询流程,根节点是最终结果,子节点是输入和操作。
示例:
∪
/ \
πname πbar
| |
σaddr=“Maple St.” σprice<3 AND beer=“Bud”
| |
Bars Sells
五、结果模式(Schema of Results)
操作 | 结果模式 |
---|---|
并、交、差 | 同两个操作数的模式 |
选择 | 与原表结构相同 |
投影 | 指定列组成的结构 |
笛卡尔积 | 所有属性合并,若重名则加前缀 |
Theta 连接 | 同笛卡尔积 |
自然连接 | 合并两个表的属性,去掉重复列 |
重命名 | 按照重命名规则来定义 |
六、多包代数(Bag Algebra)
SQL 实际上是一种基于“包”(bag 或 multiset)的语言,即允许重复元组存在。
包 vs 集合
操作 | 包的行为 | 集合的行为 |
---|---|---|
选择( | 对每一行单独处理,不影响重复性 | 同左 |
投影( | 不去重 | 去重 |
并( | 求和(如 | 合并( |
交( | 取最小出现次数 | 同集合 |
差( | 出现次数相减(不能为负) | 同集合 |
七、关系代数定律(Algebra Laws)
一些在集合代数中成立的定律在包代数中不一定成立:
定律 | 是否适用于包? |
---|---|
并交换律( | ✅ 成立 |
并幂等律( | ❌ 不成立(包中变成两倍) |
连接结合律 | ✅ 成立 |
分配律 | ❌ 不一定成立 |
八、总结表格
操作符 | 中文名 | 功能 |
---|---|---|
选择 | 选出满足条件的行 | |
投影 | 选出某些列 | |
笛卡尔积 | 两表所有行组合 | |
Theta 连接 | 按条件连接 | |
自然连接 | 按同名属性等值连接 | |
重命名 | 更改关系或属性名 | |
并 | 合并两个关系 | |
交 | 取两个关系共有的元组 | |
差 | 取第一个中有但第二个中没有的元组 |
九、典型应用示例
示例 1:查找住在 Maple St 的酒吧名字
示例 2:查找卖 Bud 啤酒价格低于$3 的酒吧
示例 3:查找既在 Maple St 上又卖 Bud 的酒吧(并集)
如果你需要我帮你整理成 PDF、Word 文档,或者想看图解、练习题,都可以告诉我 😊