数据库系统概念笔记CH6 形式化关系查询语言

时间:2024-03-18 21:54:55

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

6.1关系代数

基本关系运算:

  • select: σ,选择运算选出满足特定谓词的元组

    例如 :

    选出物理系的教职人员:
    σdept_name=Physics(instructor) \sigma_{dept\_name='Physics'}(instructor)
    选出物理系且工资大于80000的教职人员:
    σdept_name=Physics(salary>80000)(instructor) \sigma_{dept\_name='Physics' \land (salary>80000)}(instructor)

数据库系统概念笔记CH6 形式化关系查询语言

  • project: Π, 返回筛选属性后的集合,只显示选择的属性

    例如:

    选出老师的ID和name
    id,name(instructor) \prod_{}{id,name}(instructor)
    选出物理系老师的ID name salary
    id,name,salary(σdept_name=Physics(instructor)) \prod_{}{id,name,salary}(\sigma_{dept\_name='Physics'}(instructor))
    数据库系统概念笔记CH6 形式化关系查询语言

  • union: 集合的并集运算

    例子:

    找出开设在2009年秋季或2010年春季或二者都开的课程:
    course_id(σsemester=Fallyear=2009(section))course_id(σsemester=Springyear=2010(section)) \prod_{}{course\_id}(\sigma_{semester='Fall'\land{}year=2009}(section))\bigcup_{ }\prod_{}{course\_id}(\sigma_{semester='Spring'\land{}year=2010}(section))
    数据库系统概念笔记CH6 形式化关系查询语言

  • set difference: 集合差运算,r-s 表示在r中但不在s中的元组

    例子:

    找出开设在2009年秋季但不在2010年春季开设的课程:
    course_id(σsemester=Fallyear=2009(section))course_id(σsemester=Springyear=2010(section)) \prod_{}{course\_id}(\sigma_{semester='Fall'\land{}year=2009}(section))\bigcup_{ }\prod_{}{course\_id}(\sigma_{semester='Spring'\land{}year=2010}(section))
    数据库系统概念笔记CH6 形式化关系查询语言

  • Cartesian product: x ,笛卡尔积运算

    例子:

    找出物理系的所有教师以及他们教授的课程
    name,course_id(σinstructor.id=teaches.iddeptname=Physics(instructor×teaches)) \prod_{}{name,course\_id}(\sigma_{instructor.id=teaches.id }\land_{dept_name='Physics'}(instructor×teaches) )
    数据库系统概念笔记CH6 形式化关系查询语言

  • rename: ρ ,用于更名
    ρx(A1,A2,...An)(E) \rho_{x(A1,A2,...An)}(E)
    返回表达式E的结果并将名称改为x,并将属性名改为A1,A2,…An

附加的关系运算

  • 交集运算

    例如:

    找出开设在2009年秋季以及2010年春季都开设的课程:
    course_id(σsemester=Fallyear=2009(section))course_id(σsemester=Springyear=2010(section)) \prod_{}{course\_id}(\sigma_{semester='Fall'\land{}year=2009}(section))\bigcap_{ }\prod_{}{course\_id}(\sigma_{semester='Spring'\land{}year=2010}(section))
    数据库系统概念笔记CH6 形式化关系查询语言

  • 自然连接运算

    例如:

    找出所有教师的姓名以及他们教授的课程id
    name,course_id(instructorteaches) \prod_{}{name,course\_id}(instructor\Join_{}teaches)
    找出计算机系的老师姓名以及他们的课程名称
    name,title(σdept_name=Comp(instructorteachescourse)) \prod_{}{name,title}({\sigma_{dept\_name='Comp'}}(instructor\Join_{}teaches\Join_{}course))
    数据库系统概念笔记CH6 形式化关系查询语言

一些扩展的运算操作:

可以在属性处进行基本运算:
id,name,salary/12(instructor) \prod_{}{id,name,salary/12}(instructor)
可以使用聚类函数:
Gsum(salary)(instructor) G_{sum(salary)}(instructor)

6.2元组关系演算

通用格式:
{tP(t)} \{t|P(t)\}
表示使所有P为真的t的元组集合

找出工资在80000美元以上的教师的ID、name、dept_name、salary:
{ttinstructort[salary]>80000} \{t|t\in{instructor}\land t[salary]>80000\}
找出工资大于80000美元的教师的ID
{tsinstructor(t[ID]=s[ID]s[salary]>80000)} \{t|\exists{s}\in{instructor}(t[ID]=s[ID]\land{s[salary]>80000)}\}

练习题:

考虑下图所示的关系数据库,主码加了下划线。给出关系代数表达式来表达下列的每一个查询:
数据库系统概念笔记CH6 形式化关系查询语言

a.找出First Bank Corporation的所有员工姓名
person_name(σcompany_name=FirstBankCorporation(works)) \prod_{}{person\_name} (\sigma_{company\_name = “First Bank Corporation” }(works))
b.找出First Bank Corporation所有员工的姓名和居住城市
person_name,city(employee(σcompany_name=FirstBankCorporation(works))) \prod_{}{person\_name,city }{ }(employee \Join(\sigma_{company\_name = “First Bank Corporation”} (works)))
c.找出First Bank Corporation所有年收入在10000美元以上的员工姓名和居住的街道、城市。
person_name,street,city(σ(company_name=FirstBankCorporationsalary>10000)worksemployee) \prod_{}person\_name, street, city(\sigma_{(company\_name = “First Bank Corporation” ∧ salar y > 10000)}works \Join employee)
d.找出所有居住地与工作的公司在同一城市的员工姓名
person_name(employeeworkscompany) \prod_{}person\_name (employee \Join works \Join company)
e.假设公司可以位于几个城市中。找出满足下面条件的所有公司,它位于Small Bank Corporation所位于的每一个城市。
company_name(company÷(city(σcompany_name=SmallBankCorporation(company)))) \prod_{}company\_name (company ÷(\prod_{}city (\sigma_{company\_name =“Small Bank Corporation”} (company))))