关系代数是一种过程化查询语言。它包括一个运算的集合,这些运算以一个或两个关系为输入,产生一个新的关系作为结果。关系代数基本运算有:选择、投影、并、集合差、笛卡尔积和更名。在基本运算外,还有一些其他运算,即集合交、自然连接和赋值。
选择运算。选择运算选出满足给定谓词的元组。用 σ \sigma σ表示选择,谓词写作 σ \sigma σ的下标。例如:
选择关系instructor中属于“Physics”的元组 σ d e p t _ n a m e = " P h y s i c s " ( i n s t r c u t o r ) \sigma_{dept\_name="Physics"}(instrcutor) σdept_name="Physics"(instrcutor) 通常,谓词可以进行比较,使用的是 = , ≠ , < , > , ≤ , ≥ =,\ne,<,>,\le,\ge =,=,<,>,≤,≥,也可以通过 ∧ , ∨ , ¬ \wedge,\vee,\neg ∧,∨,¬。例如:
选择物理系中工资大于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 ) \sigma_{dept\_name="Physics"\ \vee\ 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 ) \sigma_{dept\_name=building}(department) σdept_name=building(department)
投影运算。投影运算用 Π \Pi Π表示。投影可以从关系中选出特定的属性来形成新的关系,由于新的关系也是一个集合,所有重复行均被去除。例如我们想要列出所有教师的ID,name,salary,而不关心dept_name,可以如下给出 Π 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)
并运算。并运算用 ∪ \cup ∪表示。只有相容的集合才可以做并运算,即两个关系属性的数目且对应属性的域集是相同的。例如,找出开设在2009年秋季学期或者2010春季学期的course_id Π c o u r s e _ i d ( σ y e a r = 2009 ∧ s e m a s t e r = " F a l l " ( s e c t i o n ) ) ∪ Π c o u r s e _ i d ( σ y e a r = 2010 ∧ s e m a s t e r = " S p r i n g " ( s e c t i o n ) ) \Pi_{course\_id}(\sigma_{year=2009\ \wedge\ semaster="Fall"}(section))\ \cup\\ \Pi_{course\_id}(\sigma_{year=2010\ \wedge\ semaster="Spring"}(section)) Πcourse_id(σyear=2009 ∧ semaster="Fall"(section)) ∪Πcourse_id(σyear=2010 ∧ semaster="Spring"(section))
差运算。差运算使用 − - −表示。差运算给出在一个关系中而不在另一个关系中的元组。和并运算一样,差运算也需要在相容的关系中进行。例如,找出开设在2009年秋季学期而不开设在2010春季学期的course_id Π c o u r s e _ i d ( σ y e a r = 2009 ∧ s e m a s t e r = " F a l l " ( s e c t i o n ) ) − Π c o u r s e _ i d ( σ y e a r = 2010 ∧ s e m a s t e r = " S p r i n g " ( s e c t i o n ) ) \Pi_{course\_id}(\sigma_{year=2009\ \wedge\ semaster="Fall"}(section))\ -\\ \Pi_{course\_id}(\sigma_{year=2010\ \wedge\ semaster="Spring"}(section)) Πcourse_id(σyear=2009 ∧ semaster="Fall"(section)) −Πcourse_id(σyear=2010 ∧ semaster="Spring"(section))
笛卡尔积运算。笛卡尔积运算使用x表示。笛卡尔积运算使得我们可以将任意两个关系的信息组合在一起,而不论属性名是否重复。例如, r = i n s t r u c t o r x t e a c h e s r=instructor\ \text{x}\ teaches r=instructor x teaches的关系模式为 ( i n s t r c t o r . I D , i n s t r c t o r . n a m e , i n s t r c t o r . d e p t _ n a m e , i n s t r c t o r . s a l a r y , t e a c h e r s . I D , t e a c h e r s . c o u r s e _ i d , t e a c h e r s . s e c _ i d , t e a c h e r s . s e m e s t e r , t e a c h e r s . y e a r ) (instrctor.ID,instrctor.name,instrctor.dept\_name,instrctor.salary,\\ teachers.ID,teachers.course\_id,teachers.sec\_id,teachers.semester,teachers.year) (instrctor.ID,instrctor.name,instrctor.dept_name,instrctor.salary,teachers.ID,teachers.course_id,teachers.sec_id,teachers.semester,teachers.year) 对于两个关系中不相同的属性,往往省略关系名前缀而不会产生任何歧义。
更名运算。更名运算使用 ρ \rho ρ表示。使用更名运算可以为原有关系或经关系运算产生的结果附上名字,以便后续进行关系运算的表示。例如将关系 E E E更名为 x x x ρ x ( E ) \rho_x(E) ρx(E) 也可以将 E E E中的属性更名 ρ x ( A 1 , A 2 , … , A n ) ( E ) \rho_{x(A_1,A_2,\dots,A_n)}(E) ρx(A1,A2,…,An)(E)
6个基本关系代数运算足以表达任何关系代数查询。但是,在某些情况下,仅使用基本关系代数运算会使表达式变得冗长。因此,我们定义一些附加的运算,虽然不能增强关系代数的表达能力,但可以简化一些常用的查询。
集合交运算。集合交使用 ∩ \cap ∩表示。例如,找出开设在2009年秋季学期和2010春季学期的course_id Π c o u r s e _ i d ( σ y e a r = 2009 ∧ s e m a s t e r = " F a l l " ( s e c t i o n ) ) ∩ Π c o u r s e _ i d ( σ y e a r = 2010 ∧ s e m a s t e r = " S p r i n g " ( s e c t i o n ) ) \Pi_{course\_id}(\sigma_{year=2009\ \wedge\ semaster="Fall"}(section))\ \cap\\ \Pi_{course\_id}(\sigma_{year=2010\ \wedge\ semaster="Spring"}(section)) Πcourse_id(σyear=2009 ∧ semaster="Fall"(section)) ∩Πcourse_id(σyear=2010 ∧ semaster="Spring"(section)) r ∩ s r\ \cap\ s r ∩ s 的等价表述是 r − ( r − s ) r-(r-s) r−(r−s)
自然连接运算。自然连接运算使用 ⋈ \bowtie ⋈表示。其找出两个关系中所有相同属性中对应取值也相同的元组。例如,找出计算机系的所有教师,以及他教授的课程的所有课程名称。 Π n a m e , t i t l e ( σ d e p t _ n a m e = " C o m p . s c i " ( i n s t r u c t o r x t e a c h e s x c o u r s e ) ) \Pi_{name,title}(\sigma_{dept\_name="Comp.sci"}(instructor\ \text{x}\ teaches\ \text{x}\ course)) Πname,title(σdept_name="Comp.sci"(instructor x teaches x course)) r ⋈ s r\ \bowtie\ s r ⋈ s 的等价表述是 Π r ∪ s ( σ r . A 1 = s . A 1 , r . A 2 = s . A 2 , … , r . A n = s . A n ( r x s ) ) \Pi_{r\cup s}(\sigma_{r.A_1=s.A_1,r.A_2=s.A_2,\dots,r.A_n=s.A_n}(r\ \text{x}\ s)) Πr∪s(σr.A1=s.A1,r.A2=s.A2,…,r.An=s.An(r x s)),其中 A i A_i Ai表示 r r r和 s s s的公有属性。
赋值运算。赋值运算使用 ← \leftarrow ←表示。赋值运算将关系代数表达式结果赋值给临时关系变量。例如 t e m p ← R ⋈ S temp\leftarrow R\ \bowtie\ S temp←R ⋈ S