关系数据语言可以分为三类: 关系代数、关系演算和介于关系代数与关系演算之间的语言 SQL。
下面专门讲述用对关系进行运算来表达查询要求的关系代数。关系代数的运算对象是关系,运算结果也是关系。关系代数用到的运算符包括四类:集合运算符、专门的关系运算符、算术比较运算符和逻辑运算符,其中比较运算符和逻辑运算符是用来辅助运算的专门关系运算符。
传统的集合运算包括并、交、差和广义笛卡儿积等。集合运算把关系看做元组的集合,从水平(行)方向进行运算,广义笛卡儿积把两个关系的元组以所有可能的方式组成对。专门的关系运算包括选择、投影、连接和除等,既从行又从列的方向进行运算。“选择”会删除某些行;“投影”会删除某些列; 各种连接运算将两个关系的元组中有选择地组成对,构成一个新关系。
一. 传统的的集合运算
传统的集合运算包括并、交、差、广义笛卡儿积四种运算。
设关系 R和S 是相互兼容的,R和S 必须同类型(属性集相同、次序相同,但属性名可以不同)
1.并(Union)
- 数学表示:
R
∪
S
=
{
t
∣
t
∈
R
∨
t
∈
S
}
R∪S =\{t|t∈R\vee t ∈S\}
R∪S={t∣t∈R∨t∈S}
- 要求:关系 R 和 S 必须是类型相兼容的,即具有相同数量和类型的属性。
- 结果:产生一个包含 R 和 S 中所有唯一元组的新关系。
- 注意:相同元组在并集中只出现一次;
2.交 (Intersection)
- 数学表示:
R
∩
S
=
{
t
∣
t
∈
R
∨
t
∈
S
}
R∩S =\{t|t∈R\vee t∈S\}
R∩S={t∣t∈R∨t∈S}
- 要求:关系 R 和 S 必须是类型相兼容的。
- 结果:产生一个新关系,包含同时属于 R 和 S 的元组。
- 注意:相同元组在交集中只出现一次;
3.差 (Difference)
- 数学表示:
R
?
S
=
{
t
∣
t
∈
R
∨
t
?
R
}
R-S =\{t|t∈R\vee t ? R\}
R?S={t∣t∈R∨t∈/R}
- 要求:关系 R 和 S 必须是类型相兼容的。
- 结果:产生一个新关系,包含属于 R 但不属于 S 的元组。
两关系的交集可以通过差运算导出: R∩S= R-(R-S)
4.广义笛卡儿积
- 数学表示:
R
?
S
=
{
t
r
t
s
∣
t
r
∈
R
∨
t
s
∈
S
}
R*S=\{t_rt_s|t_r∈R\vee t_s∈S\}
R?S={tr?ts?∣tr?∈R∨ts?∈S}
- 结果:产生一个新关系,其每个元组由 R 的一个元组和 S 的一个元组组成,元组总数为 R 和 S 元组数的乘积。
注意事项
- 并集与交集:在实际应用中,由于关系数据库中的关系通常定义为无序集合,因此并集和交集操作会自动去除重复的元组。
- 广义笛卡儿积:这是一个强大的操作,它允许您组合来自两个关系的数据,即使它们之间没有直接的关联。这个操作是许多更复杂操作的基础,例如连接操作。
二.专门的关系运算
术语解释
- 元组(Tuple): 在关系模型中,元组是表中的一行。
- 属性(Attribute): 元组中的一个分量,类似于表中的一列。
- 属性列/属性组(Attribute List/Group): 一个或多个属性构成的集合。
- 连接(Concatenation): 把两个元组拼接在一起,形成一个更长的元组。
- 象集(Image Set): 对于关系 R 中的特定值 x,其象集包含所有在 R 中 X 值为 x 的 Z 值。
示例:R(X, Z) 关系和 X = {S} 为例,我们有:
- 001 的象集
Z
001
Z_{001}
Z001??: 包含了 S = 001 时,关系 R 中 Z 的所有值。即,所有 R 中 S 值为 001 的元组在 Z 上的值集合。
- 002 的象集
Z
002
Z_{002}
Z002??: 只包含一个值,因为在 R 中只有一个元组的 S 值为 002。
- 003 的象集
Z
003
Z_{003}
Z003??: 包含了两个值,对应于 S = 003 的两个不同的 Z 值。
1.选择 (Selection)
选择运算是关系代数中非常重要的一项运算,它对应于 SQL 中的 WHERE
子句。按照指定的条件筛选出满足条件的元组(行)。
定义
- 符号:σ
- 表达式:
σ
F
?
(
R
)
σ_F?(R)
σF??(R)
- 逻辑:从关系 R 中选择使得逻辑表达式 F 为真的所有元组t。
逻辑表达式 F
- 表达式 F 可以是任何能够对关系中的元组进行评估的逻辑条件,例如
A
1
?
=
5
、
A
2
>
10
A_1?=5、A_2>10
A1??=5、A2?>10 或者
A
3
?
=
"
J
o
h
n
"
A_3?="John"
A3??="John"。
- 这些条件可以使用逻辑运算符(AND, OR, NOT)组合起来,以形成更复杂的查询条件。
示例
如果我们有一个学生表 Students(ID,Name,Age,Major),并且我们想选择所有主修计算机科学的学生,我们可以使用以下选择表达式:
σ
M
a
j
o
r
=
"
C
o
m
p
u
t
e
r
S
c
i
e
n
c
e
"
?
(
S
t
u
d
e
n
t
s
)
σ_{Major}="Computer Science"?(Students)
σMajor?="ComputerScience"?(Students)
这将返回一个新的关系,其中包含了所有满足条件 Major="Computer Science"Major=“Computer Science” 的元组。
SQL 对应
在 SQL 中,同样的操作会用下面的查询来完成:
SELECT * FROM Students WHERE Major = 'Computer Science';
注意
- 选择运算是从关系的水平方向进行的,即它过滤掉不满足条件的行。
- 选择运算的结果仍然是一个关系,这意味着结果可以作为另一个运算的输入。
- 选择运算不会改变元组的属性,它只是简单地包含或排除整个元组。
2.投影 (Projection)
投影运算是关系代数中的另一种基本操作,它对应于 SQL 中的 SELECT
语句(特定列的选择)。投影用于提取关系中的特定列,并创建一个新的关系,该关系仅包含指定的列。
定义
- 符号:π
- 表达式:
π
A
?
(
R
)
π_A?(R)
πA??(R)
- 逻辑:从关系 R 中提取属性子集 A,并创建一个新关系,其中包含原关系的指定列。
属性子集 A
- A 是关系 R 中的属性集合,可以是任意数量的属性。
- 投影操作将从原始关系中选择这些属性,并在新关系中仅包含这些列。
示例
假设我们有一个学生表 Students(ID,Name,Age,Major),并且我们只对学生的名字和专业感兴趣,我们可以使用以下投影表达式:
π
N
a
m
e
,
M
a
j
o
r
?
(
S
t
u
d
e
n
t
s
)
π_{Name, Major}?(Students)
πName,Major??(Students)
这将返回一个新的关系,其中仅包含两列:Name 和 Major。
SQL 对应
在 SQL 中,同样的操作会用下面的查询来完成:
SELECT Name, Major FROM Students;
注意
- 投影运算是从关系的垂直方向进行的,即它只选择所需的列,而忽略其他列。
- 在执行投影运算时,可能会出现重复的行。在关系模型中,关系被视为一个集合,因此所有的重复行都会被去除,以确保结果中每个元组都是唯一的。
- 当需要对关系进行筛选和属性选择时,通常首先应用选择运算以减少数据集的大小,然后应用投影运算以提取所需的列。
3.连接 (Join)
定义
- 表示法:
R
?
A
θ
B
?
S
R?_{AθB}?S
R?AθB??S
- 逻辑:从关系 R 和 S 的广义笛卡儿积中选取满足 AθB 条件的元组对。
参数
- A 和 B:分别是关系 R 和 S 上的属性组。
- θ:比较运算符,例如
=
、
≠
、
<
、
>
=、≠、<、>
=、=、<、> 等。
类型
-
等值连接 (Equi-Join)
- 定义:当 θ 为等于(=)时的连接称为等值连接。
- 表示法:
R
?
A
=
B
?
S
R?_{A=B}?S
R?A=B??S
- 特点:只包含在指定属性上具有相等值的元组对。
-
自然连接 (Natural Join)
- 定义:一种特殊的等值连接,它自动找出两个关系中名称相同的所有属性,并基于这些属性的相等性进行连接。
- 表示法:R?S
- 特点:结果中不会有重复的属性列,仅包含那些在两个关系中共有的属性的元组。
示例
假设有两个关系 R 和 S,其中 R 中有属性 A 和 S 中有属性 B,要在 A 和 B 上进行等值连接,你会写:
R
?
A
=
B
?
S
R?_{A=B}?S
R?A=B??S
这将返回一个新的关系,其中包括了 R 和 S 的所有元组对,这些元组对在 A 和 B 上的值相等。
SQL 对应
在 SQL 中,等值连接可以使用 INNER JOIN
关键字来实现,而自然连接通常需要使用 JOIN
关键字加上适当的 ON
子句来指定连接条件。
外连接 (Outer Join)
外连接允许在连接结果中包含即使在一个关系中没有匹配元组也会出现的行。外连接有以下三种类型:
-
左外连接 (Left Outer Join)
- 包含左关系(R)的所有元组,如果在右关系(S)中没有匹配,则在右侧填充
NULL
。
-
右外连接 (Right Outer Join)
- 包含右关系(S)的所有元组,如果在左关系(R)中没有匹配,则在左侧填充
NULL
。
-
全外连接 (Full Outer Join)
- 包含左关系和右关系的所有元组,无匹配的地方填充
NULL
。
4.除运算 (Division)
除运算(Division)在关系代数中是一种稍微复杂一点的运算,它用于处理如“找到所有…”这类的查询。除运算找到所有在一个关系中的元组,它们与另一个关系中所有元组相关联。
定义
除运算是一种同时考虑行和列的运算。给定两个关系 R(X, Y) 和 S(Y, Z),其中 X、Y、Z 为属性组,除运算的结果是一个新关系,该关系包含了 R 中那些与 S 中 Y 属性上所有值都有关联的 X 属性上的值。
数学表示
给定 R(X, Y) 和 S(Y, Z),除运算定义为:
R
÷
S
=
{
t
r
?
[
X
]
∣
t
r
?
∈
R
∧
π
Y
?
(
S
)
?
Y
t
r
?
[
X
]
?
}
R÷S=\{t_r?[X]∣t_r?∈R∧π_Y?(S)?Y_{tr?[X]}?\}
R÷S={tr??[X]∣tr??∈R∧πY??(S)?Ytr?[X]??}
其中
Y
t
r
?
[
X
]
Y_{t_r?[X]}
Ytr??[X]?? 是 R 中 X 值为
t
r
?
[
X
]
t_r?[X]
tr??[X] 的象集,即 R 中所有 X 属性值为
t
r
?
[
X
]
t_r?[X]
tr??[X] 的元组在 Y 上的值的集合。
示例解释
在您的例子中,我们有关系 R(AB, CD) 和 S(CD),并且我们想找到所有与 S 中所有 CD 值都有关联的 AB 值。
- 关系 S 在 CD 上的投影是所有可能的 CD 组合,即 {(c,d),(e,f)}。
- 关系 R 中 AB 值为 (a, b) 的像集是 {(c,d),(e,f),(h,k)},它包含了 S 的所有 CD 值,因此 (a, b) 出现在结果中。
- 关系 R 中 AB 值为 (c, k) 的像集也包含了 S 的所有 CD 值,所以 (c, k) 也出现在结果中。
因此,R/S 的结果是关系中包含 (a, b) 和 (c, k) 的新关系。
注意
- 除运算通常用于处理查询,这些查询需要找到“对于所有…”这类的情况。
- SQL 没有直接支持除运算,但可以使用组合查询来实现相同的效果。