《数据库系统概念》学习笔记——形式化关系查询语言

本文详细介绍了形式化关系查询语言,包括关系代数的基本运算,如选择、投影、并、差和笛卡儿积,以及更名运算。深入探讨了集合交、自然连接、赋值等附加运算,展示了如何用这些运算表达复杂查询。此外,还对比了元组关系演算和域关系演算,强调了表达式的安全性和语言的表达能力。
摘要由CSDN通过智能技术生成

形式化关系查询语言

三种形式化语言:关系代数、元组关系演算、域关系演算。

关系代数

关系代数是一种过程化查询语言。
它包括一个运算的集合,这些运算以一个或两个关系为输入,产生一个新的关系作为结果。

关系代数的基本运算有:选择、投影、并、集合差、笛卡儿积和更名。

还有一些其他运算,即集合交、自然连接和赋值。

基本运算

选择、投影和更名运算称为一元运算,因为它们是对一个关系进行运算。
并、集合差、笛卡儿积是对两个关系进行运算,称为二元运算

选择运算

选择运算选出满足给定谓词的元组。
用希腊字母 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 ( σ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值