一、传统的集合运算
1、并运算
设关系R和关系S具有相同的目n(即两个关系都有n个属性列),且相应的属性取自同一个域,则关系R和关系S的并由属于R或属于S的元组组成。
记作:R∪S = {t | t ∈ R ∨ t ∈ S}
2、交运算
设关系R和关系S具有相同的目n,且对应的属性取自同一个域,则关系R和关系S的交由既属于R又属于S的元组组成;
记作:R∩S = {t | t ∈ R ∧ t ∈ S}
3、差运算
设关系R和关系S具有相同的目n,且对应的属性取自同一个域,则关系R与关系S的差由属于R而不属于S的所有元组组成。
记作:R−S = {t | t ∈ R ∧ t ∉ S}
4、广义笛卡尔积
两个分别为n目和m目的关系R和关系S的广义笛卡尔积是一个(n+m)列的元组集合,若R有k1个元组,S有k2个元组,则关系R和关系S的广义笛卡尔积有k1×k2个元组。
记作:R×S = {t | t = < tn, tm> ∧ tn ∈ R ∧ tm ∈ S}
二、专门的关系运算
1、选择运算
选择又称为限制,在关系R中选择满足给定条件的元组。
记作:
σ
F
(
R
)
=
{
t
∣
t
∈
R
∧
F
(
t
)
=
′
真
′
}
\sigma_F(R)= \{t|t∈R ∧ F(t)='真' \}
σF(R)={t∣t∈R∧F(t)=′真′}
例:查询年龄小于20岁的学生:σSage<20(Student)
2、投影运算
关系R上的投影是从R中选择出若干属性列组成新的关系。
记作:
π
A
(
R
)
=
{
t
[
A
]
∣
t
∈
R
}
\pi_A(R)= \{t[A] | t ∈ R\}
πA(R)={t[A]∣t∈R}
【注意】投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组,因为取消了某些属性列之后,就可能出现重复行,应取消这些完全相同的行。
例:查询学生关系Student在学生姓名和院系属性上的投影:πSname,Sdept(Student)
3、连接运算
连接也称为θ连接,从两个关系的笛卡尔积中选取属性间满足一定条件的元组。
记作:
R
∞
S
=
{
t
r
t
s
∣
t
r
∈
R
∧
t
s
∈
S
∧
t
r
[
A
]
θ
t
s
[
B
]
}
R∞S=\{t_rt_s|t_r∈R∧t_s∈S∧t_r[A] θ t_s[B]\}
R∞S={trts∣tr∈R∧ts∈S∧tr[A]θts[B]}
其中A和B分别为R和S上度数相等且可比的属性组。
①等值连接
从关系R与关系S的笛卡尔积中选取A、B属性值相等的那些元组。
记作:
R
∞
S
=
{
t
r
t
s
∣
t
r
∈
R
∧
t
s
∈
S
∧
t
r
[
A
]
=
t
s
[
B
]
}
R∞S=\{t_rt_s|t_r∈R∧t_s∈S∧t_r[A]=t_s[B]\}
R∞S={trts∣tr∈R∧ts∈S∧tr[A]=ts[B]}
②自然连接
自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且要在结果中把重复的属性去掉。
若R和S具有相同的属性组B,U为R和S全体属性集合,则自然连接可记作:
R
∞
S
=
{
t
r
t
s
[
U
−
B
]
∣
t
r
∈
R
∧
t
s
∈
S
∧
t
r
[
A
]
=
t
s
[
B
]
}
R∞S=\{t_rt_s[U-B]|t_r∈R∧t_s∈S∧t_r[A]=t_s[B]\}
R∞S={trts[U−B]∣tr∈R∧ts∈S∧tr[A]=ts[B]}
例:查询选课的学生信息和成绩:Student ∞ SC
③外连接
a.悬浮元祖:把两个关系在做自然连接时舍弃的元组
b.外连接:如果把悬浮元祖也保存在R和S自然连接(R∞S)的结果关系中,而在其他属性上填空值,则这种连接就叫做外连接。
【注意】若只保留左边关系R中的悬浮元组称为左外连接,若只保留右边关系R中的悬浮元组称为右外连接。
4、除运算
给定关系R(X,Y)和S(Y,Z),其中X,Y,Z为属性组,R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集。R和S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在X属性列上的投影:元组在X上分量值x的象集Yx包含S在Y上投影的集合。
记作:
R
÷
S
=
{
t
r
[
X
]
∣
t
r
∈
R
∧
π
y
(
S
)
⊆
Y
x
}
R÷S=\{t_r[X]|t_r∈R∧π_y(S)⊆Y_x\}
R÷S={tr[X]∣tr∈R∧πy(S)⊆Yx}
例:查询至少选修1号和3号课程的学生号码:
K = πCnoσCno='1'∨Cno='3'(C) --建立一个临时关系K包含1、3课程号
πSno,Cno(SC)÷K --至少选修1和3号课程的学号
总结
选择:用于对关系中的元组(行)选择检索查询
投影:用于对关系中的属性(列)的查询
连接:用于多个关系之间的连接
除:解决有包含关系的查询
关系代数相关示例
设有学生-课程关系数据库,它由三个关系组成,它们的模式是:
学生S(学号SNO,姓名SN,所在系DEPT,年龄AGE)、
课程C(课程号CNO,课程名CN,先修课号CPNO)、
SC(学号SNO,课程号CNO,成绩SCORE)。
请用关系代数分别写出下列查询:
(1) 检索学生的所有情况:S
(2) 检索学生年龄大于等于20岁的学生姓名:πSN(σAGE≥20(S))
(3) 检索先修课号为C2的课程号:πCNO(σCPNO=’C2’(C))
(4) 检索选修了课程号C1成绩为A的所有学生姓名:πSN(σCNO=’C1’ ∧SCORE=’A’(SC) ∞S)
(5) 检索学号为S1的学生修读的所有课程名及先修课号:πCN,CPNO(σSNO=’S1’(SC) ∞C)
(6) 检索年龄为23岁的学生所修读的课程名:πCN(σAGE=23(S) ∞SC∞C)
(7) 检索至少修读了学号为S5的学生修读的一门课的学生的姓名:πSN(S∞SC∞πCNO(σSNO=’S5’(SC)))
(8) 检索修读了学号为S4的学生所修读的所有课程的学生的姓名:πSN(S∞(πSNO,CNO (SC) ÷πCNO(σSNO=’S4’(SC))))
(9) 检索选修所有课程的学生的学号:πSNO,CNO (SC) ÷πCNO(C)
(10) 检索不选修任何课程的学生的学号:πSNO(S)−πSNO(SC)