数据库系统概念 第六章 形式化关系查询语言

363 阅读3分钟

第六章 形式化关系查询语言

6.1 关系代数

关系代数是一种过程化查询语言。它包括一个运算的集合,这些运算以一个或两个关系为输入,产生一个新的关系作为结果。关系代数基本运算有:选择、投影、并、集合差、笛卡尔积和更名。在基本运算外,还有一些其他运算,即集合交、自然连接和赋值。

6.1.1 基本运算

  • 选择运算。选择运算选出满足给定谓词的元组。用σ\sigma表示选择,谓词写作σ\sigma的下标。例如:

    选择关系instructor中属于“Physics”的元组

    σdept_name="Physics"(instrcutor)\sigma_{dept\_name="Physics"}(instrcutor)

    通常,谓词可以进行比较,使用的是=,,<,>,,=,\ne,<,>,\le,\ge,也可以通过,,¬\wedge,\vee,\neg。例如:

    选择物理系中工资大于90000的教师

    σdept_name="Physics"  salary > 90000(instructor)\sigma_{dept\_name="Physics"\ \vee\ salary\ >\ 90000}(instructor)

    选择谓词中也可以包括两个属性之间的比较,例如:

    选择系名与楼名相同的系

    σdept_name=building(department)\sigma_{dept\_name=building}(department)
  • 投影运算。投影运算用Π\Pi表示。投影可以从关系中选出特定的属性来形成新的关系,由于新的关系也是一个集合,所有重复行均被去除。例如我们想要列出所有教师的ID,name,salary,而不关心dept_name,可以如下给出

    ΠID,name,salary(instructor)\Pi_{ID,name,salary}(instructor)
  • 并运算。并运算用\cup表示。只有相容的集合才可以做并运算,即两个关系属性的数目且对应属性的域集是相同的。例如,找出开设在2009年秋季学期或者2010春季学期的course_id

    Πcourse_id(σyear=2009  semaster="Fall"(section)) Πcourse_id(σyear=2010  semaster="Spring"(section))\Pi_{course\_id}(\sigma_{year=2009\ \wedge\ semaster="Fall"}(section))\ \cup\\ \Pi_{course\_id}(\sigma_{year=2010\ \wedge\ semaster="Spring"}(section))
  • 差运算。差运算使用-表示。差运算给出在一个关系中而不在另一个关系中的元组。和并运算一样,差运算也需要在相容的关系中进行。例如,找出开设在2009年秋季学期而不开设在2010春季学期的course_id

    Πcourse_id(σyear=2009  semaster="Fall"(section)) Πcourse_id(σyear=2010  semaster="Spring"(section))\Pi_{course\_id}(\sigma_{year=2009\ \wedge\ semaster="Fall"}(section))\ -\\ \Pi_{course\_id}(\sigma_{year=2010\ \wedge\ semaster="Spring"}(section))
  • 笛卡尔积运算。笛卡尔积运算使用x表示。笛卡尔积运算使得我们可以将任意两个关系的信息组合在一起,而不论属性名是否重复。例如,r=instructor x teachesr=instructor\ \text{x}\ teaches的关系模式为

    (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表示。使用更名运算可以为原有关系或经关系运算产生的结果附上名字,以便后续进行关系运算的表示。例如将关系EE更名为xx

    ρx(E)\rho_x(E)

    也可以将EE中的属性更名

    ρx(A1,A2,,An)(E)\rho_{x(A_1,A_2,\dots,A_n)}(E)

6.1.3 附加的关系代数基本运算

6个基本关系代数运算足以表达任何关系代数查询。但是,在某些情况下,仅使用基本关系代数运算会使表达式变得冗长。因此,我们定义一些附加的运算,虽然不能增强关系代数的表达能力,但可以简化一些常用的查询。

  • 集合交运算。集合交使用\cap表示。例如,找出开设在2009年秋季学期和2010春季学期的course_id

    Πcourse_id(σyear=2009  semaster="Fall"(section)) Πcourse_id(σyear=2010  semaster="Spring"(section))\Pi_{course\_id}(\sigma_{year=2009\ \wedge\ semaster="Fall"}(section))\ \cap\\ \Pi_{course\_id}(\sigma_{year=2010\ \wedge\ semaster="Spring"}(section))

    r  sr\ \cap\ s 的等价表述是r(rs)r-(r-s)

  • 自然连接运算。自然连接运算使用\bowtie表示。其找出两个关系中所有相同属性中对应取值也相同的元组。例如,找出计算机系的所有教师,以及他教授的课程的所有课程名称。

    Πname,title(σdept_name="Comp.sci"(instructor x teaches x course))\Pi_{name,title}(\sigma_{dept\_name="Comp.sci"}(instructor\ \text{x}\ teaches\ \text{x}\ course))

    r  sr\ \bowtie\ s 的等价表述是Πrs(σr.A1=s.A1,r.A2=s.A2,,r.An=s.An(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)),其中AiA_i表示rrss的公有属性。

  • 赋值运算。赋值运算使用\leftarrow表示。赋值运算将关系代数表达式结果赋值给临时关系变量。例如

    tempR  Stemp\leftarrow R\ \bowtie\ S