关系操作

关系操作

源自:数据库系统概论(第六版) 2.6关系操作

作者:Abraham Silberschatz  Henry F.Korth  S.Sudarshan

翻译:刘琼滨 谢雪妮 赖慧芳 许雅莉

译文:

所有过程关系查询语言都提供了一组操作,可以应用于单个关系或一对关系。这些操作具有所需的良好的属性,它们的结果始终是单个关系。此属性允许以模块方式组合多个操作。具体来说,由于关系查询的结果本身就是一个关系,因此关系操作可以应用于查询以及给定关系集。

具体的关系操作以不同的语言表达,但是符合我们在本节中描述的一般框架。在第3章中,我们展示了用SQL表示的具体操作方式。

最常见的操作是选择满足某个特定谓词的单个关系的特定元组(比如工资> $ 85,000)。结果是一个新的关系,它是原始关系的一个子集。(如图2.10查询的结果是选择教练元组工资超过8500美元的关系)

例如,如果我们从图2.1的讲师关系中选择元组,满足“工资大于$ 85000”,我们将得到如图2.10所示的结果。

另一个常见的操作是从关系中选择某些属性(列)。结果是只有选定属性的新关系。例如,假设我们想要一个教员ID和薪水列表,而不列出图2.1的教员关系中的名称和dept名称值,那么结果如图2.11所示,有两个属性ID和salary。结果中的每个元组都来自于一个教师关系的元组,但只显示所选的属性。

连接操作允许通过合并双元组结合两个关系,分别来自每个关系,连接成一个元组。有许多不同的方式来连接关系(就像我们将在Chapter3中看到的那样)。图2 . 12显示了从指导者和department表中加入元组的示例,其中显示了每个教师和她工作的部门的信息。这一结果是由教师与系里关系中的每个元组相结合而形成的。

在图2.12中所示的连接形式(称为“自然连接”)中,如果其dept名称属性的值相同,则来自教师关系的元组与department关系中的元组相匹配。所有这些匹配的元组都出现在连接结果中。一般来说,两种关系的自然连接操作都匹配元组,它们的值对于两种关系中的所有属性名称都是相同的。

图2.11 从教师关系中查询的属性ID和工资的结果。

图2.12 教师和部门关系的自然连接的结果

笛卡尔积结合了两个关系中的元组,但不同于连接操作,笛卡尔积的结果包含了两个关系中的所有元组,不管它们的属性值是否匹配。

因为关系是集,我们可以在关系上执行正常的集操作。并操作执行了两个“类似结构”表的集合(比如所有研究生的表和所有本科生的表)。例如,一个部门可以获得所有学生的集合。其他的集合操作,例如intersection和set difference也可以执行。

如前所述,我们可以对查询的结果执行操作。例如,如果我们想找到那些年薪超过8.5万美元的教师的ID和薪水,我们将在上面的例子中执行前两个操作。首先,我们从教师关系中选择这些元组,其工资值大于85,000美元,然后从这个结果中选择两个属性ID和工资,结果如图2.13所示的关系

图2.13选择工资超过8.5万美元的教师的属性ID和工资

关系代数定义了一组对关系的操作,将通常的代数运算(如加法、减法或乘法)与数字运算。正如数字上的代数运算将一个或多个数字作为输入,并作为输出返回一个数字,关系代数运算通常以一或两种关系作为输入,并返回一个关系作为输出。

关系代数在Chapter6中有详细的介绍,但我们将概述了下面的一些操作。


符号(名称)


使用例子


?(选择)


? salary>=85000(instructor)

返回关系中满足给定条件的诸元组


Π(投影)


Π ID,salary(instructor)

从输入的关系中输出指定属性,移除重复的元组组成心的关系


(连接)


instructordepartment

在具有相同名称的所有属性上具有相同值的两个输入关系的输出诸元组


X(笛卡尔积)


Instructor X department

输出来自两个关系的所有元组(不管它们是否具有相同的公共属性值)


U(并)


Π name(instructor)u Π name(student)

从两个输入关系输出元组的联合。

在本例中,我们可以按任意顺序执行操作,但正如我们将看到,不是在所有情况下都会这样

有时,查询的结果包含重复的元组。例如,如果我们从教师关系中选择dept name属性,就会出现一些重复的情况,如“Comp.Sci”出现了三次。某些关系语言严格遵循集合的数学定义,并会删除重复。但考虑到从大型结果关系中删除副本需要大量处理,保留副本。在后一种情况下,这种关系就不是纯粹的数学意义上的关系。

当然,数据库中的数据必须随着时间的推移而改变。可以通过插入新元组、删除现有元组或通过更改某些属性的值修改元组来更新关系。整个关系可以被删除,也可以创建新的关系。

我们将在第3至5章中使用SQL语言讨论关系查询和更新。

时间: 2024-10-31 07:57:42

关系操作的相关文章

一对多关系 操作小总结

1.如果让一的一方维护关系,取决于的因素有1.在一的一方的映射文件中,set元素的inverse属性为default/false 2.在客户端的代码中,通过一的一方建立关系3.session.save/update方法是用来操作表的,和操作关系没有关系2.怎么样采用级联的方法通过保存一个对象从而保存关联对象1.如果session.save操作的对象是A,这个时候应该看A.hbm.xml,看set元素中cascade是否设置有级联保存2.在客户端通过A建立关联3.在客户端执行session.sav

EF Codefirst 多对多关系 操作中间表的 增删改查(CRUD)

前言 此文章只是为了给新手程序员,和经验不多的程序员,在学习ef和lambada表达式的过程中可能遇到的问题. 本次使用订单表和员工表建立多对多关系. 首先是订单表: public class Order { public int OrderId { get; set; } public string OrderTitle { get; set; } public string CustomerName { get; set; } public DateTime TransactionDate

【Android】ORM数据库框架之GreenDao【关联】关系操作

上一篇我们介绍了greendao的基本使用方法,如果您还不了解,建议先看下上篇文章再来看这篇会有更好的效果.今天我们来继续学习greendao的relation部分,即数据表的关联操作部分,greendao默认支持一对一,一对多的关系操作,多对多目前暂不支持,下面我们来一步步实现greendao的关联操作: 1.一对一关系 假设我们现在只允许一夫一妻制,好像现在就是啊,哈哈哈哈哈,那么一个男人可以娶一个老婆,一个老婆也只能有一个男人,下面我们分别创建man表和women表,来演示一对一的关联操作

hibernate中关系操作(inverse)和级联操作(cascade)详解

以用户.角色.用户文件为例讲解inverse(关系操作)和(cascade)操作 inverse 取值 true(不维护关系)或false(维护关系  默认为false) 该属性主要操作的是外键 cascade 取值null(默认值).save-update .all .delete 用户.角色是多对多的关系 用户的映射文件表示: <hibernate-mapping> <class name="com.xing.elec.domain.ElecUser" table

数据系统结构之关系操作(翻译)

Published by McGraw-Hill, a business unit of The McGraw-Hill Companies, Inc., 1221 Avenue of the Americas, New York, NY 10020. Copyright ? 2011 by The McGraw-Hill Companies, Inc. All rights reserved. Previous editions ? 2006, 2002, and 1999. 此文为自己的翻译

翻译:关系操作

转载自:<database.system.concepts>(数据库系统概念)P48-52 所有的过程关系查询语言都提供一组操作,这些操作可以应用于单个关系或一对关系.这些操作具有良好的和期望的属性,它们的结果总是一个单一的关系.这个属性允许一个以模块化的方式组合其中的几个操作.具体来说,由于关系查询的结果本身就是一个关系,因此关系操作可以应用于查询的结果以及给定的关系集. 具体的关系操作根据语言的不同而有所不同,但是适合我们在本节中描述的通用框架.在第3章中,我们展示了用SQL表示操作的具体

Python 集合的各种操作 数学运算 关系操作 增删改查 生成式

# 集合是无序的 是可变的 不能重复 允许数学运算 分散存储 # 创建# collegel = {'哲学','经济学','法学','教育学'}## # {'教育学', '经济学', '法学', '哲学'}# print(collegel)## # set# collegel2 = set(['金融学','哲学','经济学','法学','教育学'])# print(collegel2)## # 使用set创建字符串集合# collegel3 = set('中华人民共和国')# # {'共', '华

【Python基础知识】(31)Set之间的关系操作

1. ==:判断集合是否相等 2. issubset:是否为子集 3. issuperset:是否为父集 4. isdisjoint:判断是否存在相同元素,存在返回False,不存在返回True # 集合间的关系操作 s1 = {1, 2, 3, 4, 5, 6} s2 = {6, 5, 4, 3, 2, 1} # ==判断两个集合是否相等 print(s1 == s2) # 输出:True s3 = {7, 8, 9, 10} s4 = {1, 2, 3, 4, 5, 6, 7, 8} # i

ServiceStack.Redis 中关系操作的局限与bug

redis是文档型的,nosql中难处理的是关系. 比如人可以发博客,博客可以有分类.按照传统sql中,用户表和分类表都是主表,博客表是从表,有用户的外键和分类的外键 如果使用文档型的思考方式. 为用户A(User id=1)存储他的博客,在redis中是list或set 为分类A(Cate id=1)存储分类下的博客,在redis中是list或set 则当用户A向分类A中添加一条新博客时,需要同时向两个list(或set)中增加数据,而且理论上应该是事务的,修改的时候也需要同时修改两个. 这样