当我们书写关系代数表达式时,我们提供了产生我们的查询结果的一个过程序列。与之相比,元组关系演算( tuple relational calculus )是非过程化的( nonprocedural )查询语言。它描述了所需信息,而不给出用于获得该信息的具体过程
在元组关系演算中的查询表达为:

{ t | P(t) }

也就是说,它是使谓词 P 为真的所有元组 t 的集合。和我们前面的记法一样,我们用 t[A] 来表示元组t在属性 A 上的取值,并且我们用 t∈r 来表示元组 t 在关系 r 中

查询示例

请找出工资在80000美元以上的教师的 ID、name、dept_name和salary :

{ t | t∈instructor ∧ t [salary]>80000}

假设我们只需要 ID 属性,而不是需要关系 instructor 的所有属性。为了用元组关系演算来书写这个査询,我们需要为在模式( ID )上的关系来写一个表达式。我们需要( ID )上这样的元组:使得在 instructor 中存在一个元组的属性 salary >80000。为了表述这样的要求,我们需要引入数理逻辑中的“存在”这一结构。记法:

ヨ t ∈ r(Q(t))

表示“在关系 r 中存在一个元组 t 使谓词 Q ( t )为真”。
使用这种记法,我们可以将查询‘找出工资大于80000美元的每位教师的教师 ID”表述为:

{ t | ヨ s∈instructor (t[ID] =s[ID]∧s[salary]>80000)}

我们可以这样来读上述表达式:“它是满足如下条件的所有元组 t 的集合在 instructor 关系中存在一个元组 s 使得 t 和 s 在 ID 属性上的取值相等,且 s 在 salary 属性上的取值大于80000美元。
元组变量 t 是只定义在 ID 属性上的,因为这是为 t 指定的条件所涉及的唯一属性。因此,其结果是一个在( ID )上的关系。


请考虑查询“找出位于 Watson 楼的系中的所有教师的姓名。这个查询比前一个查询稍微复杂一些,因为它涉及 instructor 和 department 两个关系。但是,正如我们将看到的那样,它所需要的只不过是在我们的元组关系演算表达式中使用两个“存在”子句,并通过 and ( ∧ )把它们连接起来。我们将此查询表述如下:

{ t | ヨ s∈instructor (t[name]=s[name]∧ヨu∈department(u[dept_name]=s[dept_name]∧u[building]=“Waston”))}

元组变量 u 被限制在位于 Watson 楼的系,而元组变量 s 被限制在与元组变量 u 的 dept_name 相匹配的教师。


V

为了找出在2017年秋季学期、2018年春季学期或者这两个学期都开设的所有课程的集合,我们在关系代数中使用并运算。在元组关系演算中,我们将使用通过 or ( V )连接的两个“存在”子句:

此表达式给出了我们至少满足下面两个条件之一的所有 course_id 元组的集合:

  • 在 section 关系中满足 semeter = Fall 且 year =2017的某个元组包含该 course_id
  • 在 section 关系中满足 semeter = Spring 且 year =2018的某个元组包含该 course_id
    如果同一门课程在2017年秋季学期和2018年春季学期都开设、那么它的 course_id 只出现一次,因为集合的数学定义并不允许重复的成员
    如果我们现在只想要在2017年秋季学期和2018年春季学期都开设的课程的course_id 的值,我们所需做的只不过是把上述表达式中的 or ( V )改为 and (∧)。

现在请考虑查询“找出在2017年秋季学期授课而在2018年春季学期不授课的所有课程”。对于这个查询的元组关系演算表达式同我们刚刚见过的表达式类似,只不过是使用了 not (┓)符号:

这个元组关系演算表达式用ヨs∈ section (…)子句来要求特定的 course_id 是在2017年秋季学期开设的,并且它用┓ヨu∈ section (…)子句来去掉那些作为在2018年春季学期已开设过的课程出现在 section 关系的某个元组中的 course_id 的值。


=﹥

接下来我们要考虑的查询将用到蕴含,用=﹥来表示。公式 P=﹥ Q 表示“ P 蕴含 Q ”,也就是说,“如果 P 为真,则 Q 必然为真”。请注意 P=﹥Q 逻辑上等价于┓PVQ 。使用蕴含而不是 not 和 or 常常可以更直观地解释查询的含义。
请考虑这样的查询:“找出选修了生物( Biology )系所开设的全部课程的所有学生”。为了用元组关系演算书写这个查询,我们引入“对于所有的”结构,用∀表示。记法:

∀ t∈r (Q(t))

表示“对于关系 r 中的所有元组 t , Q 均为真”。
对于我们的查询,我们书写如下的表达式:

我们可以把这个表达式理解为:“它是所有这样的学生(即( ID )上的元组t)的集合:对于在 course 关系中的所有元组 u ,如果 u 在 dept_name 属性上的值是‘ Biology ’,那么在 takes 关系中一定存在一个包含该学生 ID 以及该 course_id 的元组。”
请注意在上述查询中有一点很微妙:如果生物系没有开设任何课程,则所有的学生 ID 都满足条件。在这种情况下,上述查询表达式的第一行非常关键——如果没有条件:

ヨr ∈ student (r[ID]=t[ID])

那么若生物系没有开设任何课程,则任何一个 t 值(包括不是在 student 关系里的学生 ID 的值)都会符合要求。


形式化定义

我们现在可以给出形式化定义了。元组关系演算表达式具有如下形式:

{ t | P(t) }

其中P是一个公式(formua)。公式中可以出现多个元组变量。如果元组变量不被ヨ或∀量化,则称自由变量。因此,在

t∈instructor ∧ ヨs∈department(t[dept_name]=s[dept_name])

中,t是自由变量。元组变量s称为受限变量。


表达式的安全性

最后还要讨论一个问题。元组关系演算表达式可能产生一个无限的关系。假设我们书写表达式:

{ t | ┓(t∈ instructor)}

不在 instructor 中的元组有无限多个,大多数这样的元组所包含的值甚至根本不在数据库中!我们并不希望允许这样的表达式
为了帮助我们定义对元组关系演算的限制,我们引入了元组关系公式 P 的( domain )这一概念。直观地说, P 的域用 dom (P)来表示,它是 P 所引用的所有值的集合。它们既包括在 P 自身中用到的值,又包括在 P 中涉及到的关系的元组中所出现的值。因此, P 的域是在 P 中显式出现的所有值、或者其名称出现在 P 中的一个或多个关系中出现的所有值的集合。例如, dom ( t∈ instructor∧t[salary] >80000)是包括80000以及出现在 instructor 关系的任意元组的任意属性中的所有值的集合。类似地, dom (┓( t∈ instructor ))也是在instructor 中出现的所有值的集合,因为 instructor 关系在表达式中涉及了
如果出现在表达式{ t | P ( t )}结果中的所有值均来自于 dom ( P ),则我们说表达式{ t | P ( t )}是安全的。表达式{ t | ┓(t∈ instructor)}是不安全的。请注意 dom (┓(t∈ instructor))是出现在 instructor 中的所有值的集合。但是,可能有一个不在 instructor 中的元组t、它包含的值并没有在 instructor 中出现。我们在这一节中所书写的元组关系演算表达式的其他示例都是安全的。
满足诸如{ t | ┓(t∈ instructor)}这样的不安全表达式的元组数量可以是无限的,而安全的表达式保证具有有限的结果。因此所允许的元组关系演算表达式的类別被限定为那些安全的表达式。

关系代数 元组关系演算相关推荐

  1. 笔记 ~ 第二章 - 2.2 关系操作、关系完整性、关系代数、关系演算

    目录 1. 关系操作 (1)基本关系操作 ① 常用的关系操作 ② 关系操作的特点 (2)关系代数语言 ① 关系代数语言 ② 关系演算语言 ③ 具有关系代数和关系演算双重特点的语言 2. 关系的完整性 ...

  2. 关系代数 域关系演算

    关系演算的第二种形式称为域关系演算( domain relational calculus ),它使用从属性域中取值的域( domain )变量,而不是对于整个元组的值.尽管如此,域关系演算同元组关系 ...

  3. 数据库——元组关系演算语言ALPHA

    元组关系演算语言ALPHA 简介 一.检索操作(GET) 1.简单检索 2.带条件的检索 3.带排序的检索 4.带定额的检索 5.用元组变量的检索 6.用存在量词的检索 7.带有多个关系的表达式的检索 ...

  4. 读书笔记:《七周七数据库》

    概述 核心问题:哪种数据库或数据库组合最好地解决了你的问题? 关系型数据库:PostgreSQL 以集合理论为基础,实现为具有行和列的二维表: 使用结构化查询语言编写查询: 表可以连接并转化为新的.更 ...

  5. mysql 中外码和主码_数据库原理与应用(6)——关系的候选码、主码和外码、关系完整性、关系代数、元组关系的演算、域关系演算...

    一.关系的候选码 候选码(Candidate Key):能唯一标识关系中元组的一个属性或属性集 性质:唯一性,最小性 二.关系的主码和外码 主码(Primary Key):从多个候选码中选择一个作为查 ...

  6. 2.2 《数据库系统概论》之关系操作、关系完整性、关系代数

    文章目录 0.思维导图 1.关系操作 (1)基本关系操作 (2)关系数据库语言的分类 2.关系的完整性 (1)关系的三类完整性约束 (2) 实体完整性(Entity Integrity) (3)参照完 ...

  7. 数据库杂谈(四)——关系演算和E-R数据模型

    文章目录 3 形式化关系查询语言 3.2 关系演算和E-R数据模型 3.2.1 概述 3.2.2 元组关系演算 3.2.2.1 概述 3.2.2.2 形式化定义 3.2.2.3 表达式的安全性 3.2 ...

  8. 三、外码、关系的完整性约束、关系代数

    一.外码(外键,FOREIGN KEY) 学生关系:学号是主码 选课关系:(学号,课程号)是主码,学号是外码,取值参照了学生关系的主码"学号"的值:课程号也是外码,取值参照了课程关 ...

  9. 数据库系统-关系代数

    数据库系统-关系代数 关系数据库语言的分类 关系代数语言 用对关系的运算来表达查询要求 关系演算语言 元组关系演算语言 谓词变元的基本对象是元组变量 代表:APLHA,QUEL 域关系演算语言 谓词变 ...

  10. mysql图书管理数据库的三个关系模式_数据库 考虑如下关于图书馆的关系模式,用关系代数写出查询(数据库系统概念第六版6.14)...

    贝尔梅尔娜美 2019.03.15 采纳率:60%    等级:39 已帮助:91565人 数据库系统的基本概念 数据:实际上就是描述事物的符号记录. 数据的特点:有一定的结构,有型与值之分,如整型. ...

最新文章

  1. ORB-SLAM2安装
  2. 为什么说Python是一门动态语言--Python的魅力
  3. jeasyui控件事件和方法的使用方法
  4. Java客户端操作zookeeper:获取/节点的子节点代码示例
  5. mysql添加字段时定义候选键_MySQL 表约束
  6. 转换流指定编码读写文件
  7. 深入理解Solidity 二
  8. 阅读构建之法10、11、12章
  9. NRF24L01发送接收调试记录
  10. 元宇宙会成为IPv6的拐点吗?
  11. section和div有什么区别?
  12. 关于C#语言中的集合
  13. linux php oauth安装,Linux安装phpmyadmin
  14. tcp keeplive
  15. c语言除法保留1位小数,高精度除法小数点位数
  16. SQLServer 2008 r2 安装图解
  17. 规范第三方支付易加大竞合关系
  18. python练习-跳跃游戏
  19. VR全景如何应用在家装中?体验真实的家装效果
  20. 怎么让鼠标带黄色光圈?

热门文章

  1. 使用SoftEther 上免费校园网(ipv6)
  2. Vrep学习笔记(二)
  3. vue2-ts-template vue2后台管理系统模板
  4. Python 代码库之Tuple如何append添加元素
  5. c语言写马达驱动程序,如何用单片机驱动马达
  6. 51 单片机 程序编写
  7. C#制作单机版桌面软件(带数据库)
  8. 广东大学计算机基础教材,21世纪高等学校计算机公共基础课规划教材:大学计算机基础(第2版)...
  9. aspose.words生成pdf字体乱码为方框
  10. 小程序开发——比较好看的登录界面设计