第六章 形式化关系查询语言
6.1 关系代数
关系代数是一种过程化查询语言。它包括一个运算的集合,这些运算以一个或两个关系为输入,产生一个新的关系作为结果。关系代数基本运算有:选择、投影、并、集合差、笛卡尔积和更名。在基本运算外,还有一些其他运算,即集合交、自然连接和赋值。
6.1.1 基本运算
-
选择运算。选择运算选出满足给定谓词的元组。用σ表示选择,谓词写作σ的下标。例如:
选择关系instructor中属于“Physics”的元组
σdept_name="Physics"(instrcutor)
通常,谓词可以进行比较,使用的是=,=,<,>,≤,≥,也可以通过∧,∨,¬。例如:
选择物理系中工资大于90000的教师
σdept_name="Physics" ∨ salary > 90000(instructor)
选择谓词中也可以包括两个属性之间的比较,例如:
选择系名与楼名相同的系
σdept_name=building(department)
-
投影运算。投影运算用Π表示。投影可以从关系中选出特定的属性来形成新的关系,由于新的关系也是一个集合,所有重复行均被去除。例如我们想要列出所有教师的ID,name,salary,而不关心dept_name,可以如下给出
ΠID,name,salary(instructor)
-
并运算。并运算用∪表示。只有相容的集合才可以做并运算,即两个关系属性的数目且对应属性的域集是相同的。例如,找出开设在2009年秋季学期或者2010春季学期的course_id
Πcourse_id(σyear=2009 ∧ semaster="Fall"(section)) ∪Πcourse_id(σyear=2010 ∧ semaster="Spring"(section))
-
差运算。差运算使用−表示。差运算给出在一个关系中而不在另一个关系中的元组。和并运算一样,差运算也需要在相容的关系中进行。例如,找出开设在2009年秋季学期而不开设在2010春季学期的course_id
Πcourse_id(σyear=2009 ∧ semaster="Fall"(section)) −Πcourse_id(σyear=2010 ∧ semaster="Spring"(section))
-
笛卡尔积运算。笛卡尔积运算使用x表示。笛卡尔积运算使得我们可以将任意两个关系的信息组合在一起,而不论属性名是否重复。例如,r=instructor x teaches的关系模式为
(instrctor.ID,instrctor.name,instrctor.dept_name,instrctor.salary,teachers.ID,teachers.course_id,teachers.sec_id,teachers.semester,teachers.year)
对于两个关系中不相同的属性,往往省略关系名前缀而不会产生任何歧义。
-
更名运算。更名运算使用ρ表示。使用更名运算可以为原有关系或经关系运算产生的结果附上名字,以便后续进行关系运算的表示。例如将关系E更名为x
也可以将E中的属性更名
ρx(A1,A2,…,An)(E)
6.1.3 附加的关系代数基本运算
6个基本关系代数运算足以表达任何关系代数查询。但是,在某些情况下,仅使用基本关系代数运算会使表达式变得冗长。因此,我们定义一些附加的运算,虽然不能增强关系代数的表达能力,但可以简化一些常用的查询。
-
集合交运算。集合交使用∩表示。例如,找出开设在2009年秋季学期和2010春季学期的course_id
Πcourse_id(σyear=2009 ∧ semaster="Fall"(section)) ∩Πcourse_id(σyear=2010 ∧ semaster="Spring"(section))
r ∩ s 的等价表述是r−(r−s)
-
自然连接运算。自然连接运算使用⋈表示。其找出两个关系中所有相同属性中对应取值也相同的元组。例如,找出计算机系的所有教师,以及他教授的课程的所有课程名称。
Πname,title(σdept_name="Comp.sci"(instructor x teaches x course))
r ⋈ s 的等价表述是Πr∪s(σr.A1=s.A1,r.A2=s.A2,…,r.An=s.An(r x s)),其中Ai表示r和s的公有属性。
-
赋值运算。赋值运算使用←表示。赋值运算将关系代数表达式结果赋值给临时关系变量。例如
temp←R ⋈ S