一、基本运算(5种) ------ 可以表达所有其他运算的基础
-
选择(Selection,σ)
- 从关系中选出满足条件的元组(行)。
- 符号:σ
- 示例:σ_{salary > 5000}(Employee)
-
投影(Projection,π)
- 选出指定属性列,去除重复元组。
- 符号:π
- 示例:π_{name, dept}(Employee)
-
并(Union,∪)
- 两个兼容关系的元组集合合并,自动去重。
- 要求:两个关系属性数相同、域兼容。
- 示例:R ∪ S
-
集合差(Set Difference,−)
- 属于 R 但不属于 S 的元组。
- 示例:R − S
-
笛卡尔积(Cartesian Product,×)
- 两个关系的元组所有可能组合。
- 示例:Employee × Department
二、扩展运算(常见且重要,常被视为基本操作的补充)
-
重命名(Rename,ρ)
- 给关系或属性赋予新名字,用于表达自连接或避免歧义。
- 符号:ρ
- 示例:ρ_{E1}(Employee) 将 Employee 重命名为 E1
-
连接(Join)
- 笛卡尔积 + 选择的组合,用于基于条件关联两个关系。
- 常见类型:
- θ-连接(Theta Join):R ⋈_{条件} S
- 等值连接(Equi-join):基于等值条件的连接
- 自然连接(Natural Join) :自动匹配同名属性并去重
- 符号:⋈
- 示例:Employee ⋈ Department(自动按 dept_id 等值连接并合并同名属性)
-
外连接(Outer Join) ------ 保留未匹配元组
- 左外连接(⟕):保留左表所有元组
- 右外连接(⟖):保留右表所有元组
- 全外连接(⟗):保留两个表的所有元组
-
除法运算(Division,÷)
- 用于表达"全部"语义的查询。
- 典型问题:
"找出选修了所有 由'数学系'开设的课程的学生"
"找出同时管理所有项目员工的经理" - 形式定义:
给定关系 R(A, B) 和 S(B),则
R ÷ S 的结果是所有在 A 上的值 a,使得对于 S 中每一个 b,元组 (a, b) 都在 R 中。 - 用基本运算表达(简化):
R ÷ S = π_A® − π_A( (π_A® × S) − R )
三、附加运算(部分系统支持)
- 赋值运算(←)
- 用于将表达式结果存入临时关系,便于分步操作。
- 示例:T ← σ_{salary>5000}(Employee)
- 聚集函数(如 γ 运算)
- 用于分组统计:sum, avg, count, min, max 等。
- 示例:γ_{dept, avg(salary)}(Employee)
- 这属于关系代数的扩展版本(如"聚集关系代数")
- 广义投影(Extended Projection)
- 支持派生属性,如:π_{id, salary*1.1}(Employee)
总结:关系代数运算一览表
| 运算 | 符号 | 元数 | 说明 |
|---|---|---|---|
| 选择 | σ | 一元 | 按条件选行 |
| 投影 | π | 一元 | 选列去重 |
| 并 | ∪ | 二元 | 集合并 |
| 差 | − | 二元 | 集合差 |
| 笛卡尔积 | × | 二元 | 所有组合 |
| 重命名 | ρ | 一元 | 改名 |
| 连接 | ⋈ | 二元 | 基于条件关联 |
| 自然连接 | ⋈(无下标) | 二元 | 自动匹配同名属性 |
| 外连接 | ⟕, ⟖, ⟗ | 二元 | 保留未匹配行 |
| 除法 | ÷ | 二元 | "全部"语义查询 |
| 赋值 | ← | ------ | 分步表达 |
| 聚集 | γ | 一元(扩展) | 分组统计 |
举个除法运算的例子:
假设:
- 职工表:Employee(eid)
- 工程表:Project(pid)
- 工作表:Work(eid, pid) ------ 表示职工参与的工程
问题 :找出参与了所有工程的职工。
表达式 :
Work ÷ π_{pid}(Project)