关系代数作用于一个或多个关系,然后产生一个新的关系。可以将关系代数理解为函数,接受一个关系输入,返回一个新对关系。举个例子,我们将并 *** 作命名为 Union ,那么并 *** 作可以表示为:
对于其他对 *** 作如差 *** 作,选择 *** 作等,都有相应对数学符号进行表示,但在中输入这些符号比较困难,再加上我学习关系代数是了解基本的概念知识,这里就不使用数学符号表示了,而是以文字代替。
关系代数定义了基于集合(关系)的 *** 作,其是 SQL 的重要基础(另一个重要基础是关系演算),了解了关系代数的概念以及各个 *** 作要达到的目的之后,对 SQL 中对一些概念也会更加清晰,如连接 *** 作。
本文首先介绍关系代数中的基础 *** 作,再介绍扩展 *** 作。
关系代数的基础 *** 作有:并,差,笛卡尔积,选择,更名,投影等。有些 *** 作如并,差等要求参与运算的关系需要具备并相容性。所谓并相容性,就是两个关系的属性数目(度)相同,并且每个度所在的域相同。
如 R(学生,学号,地址) 和 S(课程,课程号) 两个关系由于度和属性所在的域不相同,因此不具备并相容性,也就无法进行并,差等 *** 作。
相应的, R2(学生,学号,地址) 和 S(教师,教师号,地址) 由于度和属性所在的域相同,因此具备并相容性。
并 *** 作就是将两个关系合并为一个关系,在合并时去掉重复的元组。为什么要去掉重复项呢?这是集合的特质,集合要求不能有重复项。
R 并 S 和 S 并 R 得到的结果是一样的,即并 *** 作满足交换律。
举个例子,有两个关系 R(学生) 和 S(教师):
这两个关系进行并 *** 作的结果为:
差 *** 作用来选择出现在一个关系但并未出在另一个关系中的元组。
还是以上面两个关系 R(学生) 和 S(教师) 为例,R 差 S 的结果为:
S 差 R 的结果为:
其中元组 T(Jerry,2,澳大利亚) 在两个关系中都出现,是两个关系的交集。因此差 *** 作就是从一个关系中去除和另一个关系的交集所得到的集合。
差 *** 作不满足交换律。
笛卡尔积用来将两个关系连接起来,笛卡尔积的结果将两个关系中所有可能的元组组合起来。假设关系 R 的元组数目为 M,度数为 I,关系 S 的元组数目为 N,度数为 J,那么 R 和 S 进行笛卡尔积运算得到的新关系的元组数目为 M * N,度数为 I + J。
举个例子,有两个关系 R(学生) 和 S(课程) :
那么对 R 和 S 进行笛卡尔积的结果为:
笛卡尔积用来将两个关系连接在一起,获取所有可能的结果,其是连接 *** 作的基础。
选择 *** 作就是从一个关系中,选择出满足条件的元组。
如从上面的学生表中,选择出学号大于等于 2 的学生,结果为:
选择条件由与或非逻辑表达式构成。
投影 *** 作是从给定的关系中,选择出某些属性属性构成新的关系。如从学生表中投影出一个新的关系 R(姓名,地址) :
关系代数常用的扩展 *** 作有交 *** 作,Theta 连接 *** 作,自然连接 *** 作,外连接 *** 作,除 *** 作等。扩展 *** 作可以由基础 *** 作推导而来。
交 *** 作用来从两个关系中,选择出同时存在于两个关系中的元组。如上面 R(学生) 和 S(教师) 进行交 *** 作的结果为:
Theta 连接 *** 作会从两个关系的笛卡尔积中,选择出某个条件的元组,并去掉重复项。例如在上面笛卡尔积例子,选择出课程号不为 c1 并且学号不为 s1 的元组:
连接 *** 作一般和投影 *** 作配合使用,比如从上面的结果集中投影出 R(姓名,课程) :
Theta 连接 *** 作中有个特殊的 *** 作,叫做等值连接,即选择条件为判断是否相等。
自然连接可以认为是一种特殊的等值连接,其要求两个关系具有相同的属性,并且判断条件为两个关系中的某两个相同属性的值相等。
自然连接是最常用的连接 *** 作。
假如有两个关系 R(学生 ) 和 S(班级) :
对这两个关系进行自然连接的结果为:
外连接就是在自然连接的结果集中,将空值元组和没有匹配到的元素放入到结果集中。
假如有两个关系 R(学生 ) 和 S(班级) :
首先对这两个关系进行自然连接:
我们在自然连接的结果集中,机上空值元组和没有匹配到的元组:
以上就是外连接的结果,也叫做全外连接:保证两端的元素不丢失。对应的,还有左外连接和右外连接,左外连接会保证左侧的元素不丢失,右外连接会保证右侧的元素不丢失。
因此上面两个进行左外连接的结果为:
进行右外连接的结果为:
除 *** 作是对两个关系进行“除法” *** 作,要求“除数”关系是“被除数”关系的真子集。除 *** 作会从“被除数”关系中,选择出一个新的关系,设为 N,N 也是 “被除数”关系的真子集。N 需要满足一个条件:
N 和“除数”关系的笛卡尔积是“被除数”关系的最大真子集。
好绕啊···
我们还是直接看例子吧。
假设有两个关系: R(A1,A2,A3) 和 S(A3) :
对 R 和 S 进行除 *** 作,得到的结果为:
如果 S 关系为:
那么对 R 和 S 进行除 *** 作的结果为:
从上面的例子来看,除 *** 作适用于“满足全部····”的查询。举个例子,从学生表中查询选择了所有课程或者选择了软件测试和软件工程这两门课程的学生。
假设存在一个关系 R(学生) 和 S(课程) :
现在我们要查询选择了软件测试这门课的所有学生,则被除数关系为 R(学生) ,除数关系为:
对两个关系进行除 *** 作,得到的结果为:
如果我们只需要获取学生的姓名,不需要学号这一列,那么可以再对结果集进行投影 *** 作:
本文介绍了关系代数以及关系代数中常用的基础 *** 作和扩展 *** 作,基础 *** 作包括并,差,笛卡尔积,选择,投影,更名等,某些基础要做要求两个参与运算的关系具有并相容性。扩展 *** 作可以由基础 *** 作推导而来,可以完成更复杂的 *** 作。
关系代数是 SQL 语言的基础,SQL 语言是在关系代数上的一层封装,目的是方便程序员使用。
关系代数的 *** 作接受一个或多个关系作为输入,再输出一个新的关系,不同的关系 *** 作可以进行相互的组合。例如可以先进行选择 *** 作再进行投影 *** 作,先进行自然连接 *** 作再进行选择 *** 作等等。根据不同的需求需要灵活的组合这些 *** 作。
完。
关系代数是一门抽象的查询语言,它用对关系的运算来表达查询。
运算对象、运算符、运算结果是运算的三大要素。关系代数的运算对象是关系,运算结果也是关系。
设R和S是n元关系,而且两者各对应属性的数据类型也相同。R和S的并 *** 作定义为:
条件:① 等目、同元,即他们的属性数目必须相同 ② 对任意i,r的第i个属性域和s的第i个属性域相同
如:Πname(instructor)∪Πname(student)
简单来说就是: R和S所有关系都组合在一起, 重复的就不写
p是选择 *** 作,p用的是逻辑连接词,如∧、∨、┐
注:执行选择时,选择条件必须是针对同一元组中的相应属性值代入进行比较
简单来说就是: 把符合元组的拿出来
a1,a2等是属性名,r是关系名。其结果为保留此k列的值,并删除重复的行
条件:①等目、同元,即他们的属性数目必须相同 ②对任意i,r的第i个属性域和s的第i个属性域相同(和并运算一样的条件)
简单来说就是:因为是R-S, 找R在S关系中没有的
假设R的属性和S的属性没有交集就如图一,如果R和S的属性有交集,那么必须重命名这些有交集的属性
返回表达式E的结果,并赋给它名字X,同时将属性重命名为A1,A2....An
例一:找出贷款额大于1200的元组
例二:找出贷款大于1200的贷款号
例三:找出有贷款或有账户两者兼有的所有客户姓名
例四:找出至少有一个贷款及一个账户的客户姓名
例五:找出Perryridge分支机构有贷款的顾客姓名
这个查询运用了两个关系,这个时候就要运用笛卡尔积
为什么要做“σ borrow.loan-number = loan.loan-number”的判断?因为这里面的组合很多,而我们要去除掉没有意义的组合
查询二要比查询一更好一点,因为borrower x loan的数据有可能是很庞大的,降低了查询效率,而查询二先做了选择再进行笛卡尔积运算,数据量相较小一点。
例六:找出在Perryridge分支机构有贷款,但在其他分支机构没有账号的顾客姓名
例七:找出银行中最大的账户余额
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)