数据库系统概念——形式化关系查询语言
形式化关系查询语言
三种形式化语言:关系代数、元组关系演算、域关系演算。
关系代数
关系代数是一种过程化查询语言。
它包括一个运算的集合,这些运算以一个或两个关系为输入,产生一个新的关系作为结果。
关系代数的基本运算有:选择、投影、并、集合差、笛卡儿积和更名。
还有一些其他运算,即集合交、自然连接和赋值。
基本运算
选择、投影和更名运算称为一元运算,因为它们是对一个关系进行运算。
并、集合差、笛卡儿积是对两个关系进行运算,称为二元运算。
选择运算
选择运算选出满足给定谓词的元组。
用希腊字母 sigma( σ \sigma σ)来表示选择,将谓词写作 σ \sigma σ的下标。
参数关系在 σ \sigma σ后面的括号中。
选择关系instructor中属于Physics系的元组:
σ d e p t _ n a m e = " P h y s i c s " ( i n s t r u c t o r ) σ_{dept\_name = "Physics"}(instructor) σdept_name="Physics"(instructor)
通过如下内容,查询“找到工资额大于 90000美元的所有元组”:
σ s a l a r y > 90000 ( i n s t r u c t o r ) σ_{salary > 90000}(instructor) σsalary>90000(instructor)
通常,允许在选择谓词中进行比较。使用的是 =,≠,<,≤,> 和 ≥ 。
可以用连词 and(∧)、or(∨)、not(¬) 将多个谓词合并为一个较大的谓词。
如:查询“找到物理系中工资额大于90000美元的教师”
σ d e p t _ n a m e = " P h y s i c s " ∧ s a l a r y > 90000 ( i n s t r u c t o r ) σ_{dept\_name = "Physics" ∧ salary > 90000}(instructor) σdept_name="Physics"∧salary>90000(instructor)
选择谓词中可以包括两个属性的比较。
找出系名与楼名相同的系
σ d e p t n a m e = b u i l d i n g ( d e p a r t m e n t ) σ_{dept_name=building}(department) σdeptname=building(department)
关系代数中 select 对应于SQL中使用的 where。
投影运算
投影(project)运算是一元运算,它返回作为参数的关系,但把某些属性排除在外。
关系是一个集合,所以重复行均被去除。
投影用大写希腊字母pi( π \pi π)表示。
希望在结果中出现属性作为 π \pi π下标,作为参数的关系跟随在 π \pi π后括号中。
列出所有教师的ID,name,salary
Π I D , n a m e , s a l a r y ( i n s t r u c t o r ) \Pi_{ID,name,salary}(instructor) ΠID,name,salary(instructor)
关系运算的组合
关系运算的结果自身也是一个关系。
找出物理系的所有教师的名字
Π n a m e ( σ d e p t n a m e = " P h y s i c s " ( i n s t r u c t o r ) ) \Pi_{name}(σ_{dept_name="Physics"}(instructor)) Πname(σdeptname="Physics"(instructor))
一般地说,关系代数运算的结果同其输入的类型一样,仍为关系。
可把多个关系代数运算组合成一个关系代数表达式(relation-algebra expression)。
将关系代数运算组合成关系代数表达式如同将算术运算组合成算术表达式一样。
并运算
要使并运算 rUs 有意义,要求以下两个条件同时成立:
- 关系 r 和 s 必须是同元的,即它们的属性数目必须相同。
- 对所有的 i,r 的第 i 个属性的域必须和 s 的第 i 个属性的域相同。
集合差运算
用 - 表示集合差(set-difference)。
可以找出在一个关系中而不在另一个关系中的那些元组。
表达式 r - s 的结果即一个包含所有在 r 但不在 s 中所有元组构成的关系。
所有开设在2009,秋季学期,且在2010,春季不开的课程
Π c o u r s e i d ( σ s e m e s t e r = " F a l l " ∧ y e a r = 2009 ( s e c t i o n ) ) − Π c o u r s e i d ( σ s e m e s t e r = " S p r i n g " ∧ y e a r = 2010 ( s e c t i o n ) ) \Pi_{course_id}(σ_{semester="Fall" ∧ year=2009}(section)) - \Pi_{course_id}(σ_{semester="Spring" ∧ year=2010}(section)) Πcourseid(σsemester="Fall"∧year=2009(section))−Πcourseid(σsemester="Spring"∧year=2010(section))
要使集合差运算 r - s 有意义,要求:
- 关系r和s必须是同元的,即它们的属性数目必须相同。
- 对所有的 i,r 的第 i 个属性的域必须和 s 的第 i 个属性的域相同。
笛卡儿积运算
用×表示的笛卡儿积(Cartesia-product)运算,使我们可将任意两个关系的信息组合在一起。
将关系r1和r2的笛卡儿积写作r1×r2。
由于相同的属性名可能同时出现在r1和r2中,需提出一个命名机制来区别这些属性。
这里采用的方式是找到属性所来自的关系,把关系名称附加到该属性上。
对只在两个关系模式之一中出现的属性,通常省略其关系名前缀。
这个命名规则规定作为笛卡儿积运算参数的关系名字必须不同。
给关系一个名字以引用其属性。
一般地说,如果有关系r1(R1)和r2(R2),则关系r1×r2的模式是R1和R2串接而成的。
关系R中包含所有满足以下条件的元组t:
r1中存在元组t1且 r2 中存在元组 t2,使得 t[R1]=t1[R1]且t[R2]=t2[R2]。
例:
找出物理系的所有教师,以及他们教授的所有课程。
σ d e p t _ n a m e = " P h y s i c s " ( i n s t r u c t o r × t e a c h e s ) σ_{dept\_name="Physics"}(instructor×teaches) σdept_name="Physics"(instructor×teaches)
instructor×teaches 中那些只与物理系教师以及他们所教课程相关的元组。
σ i n s t r u c t o r . I D = t e a c h e s . I D ( σ d e p t _ n a m e = " P h y s i c s " ( i n s t r u c t o r × t e a c h e s ) ) σ_{instructor.ID=teaches.ID}(σ_{dept\_name="Physics"}(instructor×teaches)) σinstructor.ID=teaches.ID(σdept_name="Physics"(instructor×teaches))
最后,只需要物理系教师的名字,以及他们所教课程的 course_id ,进行投影:
Π n a m e , c o u r s e i d ( σ