Oracle关系代数

2018-01-15 14:22:19来源:oschina作者:小衰哥有点帅人点击

分享

关系代数是关系数据库系统查询语言的理论基础


一、关系代数的9种操作:

关系代数中包括了:并、交、差、乘、选择、投影、联接、除、自然联接等操作。


五个基本操作:


并(∪)、差(-)、笛卡尔积(×)、投影(σ)、选择(π)


四个组合操作:


交(∩)、联接(等值联接)、自然联接(RCROSS.gifS)、除法(÷)

1.并,交,差,笛卡尔积,除

并:设有关系R和S,且R和S的度相同,且相应的属性取自同一个域,则R和S的并属于R或属于S的元组的集合。



交:设有关系R和S,且R和S的度相同,且相应的属性取自同一个域,则R和S的交属于R又属于S的元组的集合。



差:设有关系R和S,且R和S的度相同,且相应的属性取自同一个域,则R和S的差属于R但不属于S的元组的集合。



笛卡尔积:这个不多解释,直接看图



除:这个比较复杂,下面的描述转自http://blog.sina.com.cn/s/blog_9f4669510100z2ld.html


除法运算的定义:


这个概念的描述的非常抽象,刚开始学习的同学完全不知所云。这里通过一个实例来说明除法运算的求解过程


设有关系R、S 如图所示,求R÷S 的结果



求解步骤过程:第一步:找出关系R和关系S中相同的属性,即Y属性。在关系S中对Y做投影(即将Y列取出);所得结果如下



第二步:被除关系R中与S中不相同的属性列是X ,关系R在属性(X)上做取消重复值的投影为{X1,X2};第三步:求关系R中X属性对应的像集Y


根据关系R的记录,可以得到与X1值有关的记录,如图3所示;与X2有关的记录,如图4所示


第四步:判断包含关系R÷S其实就是判断关系R中X各个值的像集Y是否包含关系S中属性Y的所有值。对比即可发现:X1的像集只有Y1,不能包含关系S中属性Y的所有值,所以排除掉X1;而X2的像集包含了关系S中属性Y的所有值,所以R÷S的最终结果就是X2 ,



也许你现在有点明白除法运算是如何操作的了,下面我们来引申一下,除法运算可以解决什么问题呢? 看下面一个小例子:设有关系R,S以及RS,如图所示,求RS÷S的结果



很容易求得结果为:{ 张三 } 所以你很容易看出来RS÷S 在这里解决的问题就是:“得到选修了所有课程的学生”RS÷S的意义就是:“在R和S的联系RS中,找出与S中所有的元组有关系的R元组”。


2.投影与选择

注1:投影(π(pi))是从一个关系出发构造其垂直子集的运算,即结果关系由运算分量中的某些列组成,并消去重复的元组。简单的来说就是选取符合条件的列。


注2:选择( σ(sigma))从一个关系中选出所有满足指定条件的元组。即在给定关系中,从水平方向上选取符合给定条件的元组的子集。简单的来说就是选取符合条件的行。



3.等值连接与自然连接

注1:等值连接表示先做笛卡尔积(×)之后,对相应列进行选择(仅筛选行、不筛选列)



注2:自然连接表示两个关系中若有相同名称的属性,则自动作为关联条件


注3:自然连接与等值连接的联系与区别



区别:等值连接不要求两个关系中进行比较的分量是相同的属性组,而只要可以进行相


等比较即可。而自然连接要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。


联系:等值连接是关系的广义笛卡尔积的子集。自然连接是一种特殊的等值连接。即两者都是两个关系连接之后的产物。



二、关系代数表达式:

由关系代数运算经有限次复合而成的式子称为关系代数表达式。这种表达式的运算结果仍然是一个关系。可以用关系代数表达式表示对数据库的查询和更新操作。

三、举例说明:

设教学数据库中有3个关系:



学生关系S(SNO,SNAME,AGE,SEX)学习关系SC(SNO,CNO,GRADE)课程关系C(CNO,CNAME,TEACHER)


(1) 检索学习课程号为C2的学生学号与成绩



------------------------------------


SELECT SNO,GRADE


FROM SC


WHERE CNO='C2'


------------------------------------


π SNO,GRADE(σCNO='C2'(SC))


************************************



(2) 检索学习课程号为C2的学生学号与姓名



------------------------------------


SELECT SC.SNO,S.SNAME


FROM SC,S


WHERE SC.SNO=S.SNO


AND SC.CNO='C2'


------------------------------------


π SNO,SNAME(σCNO='C2'(SCROSS.gifSC))



此查询涉及S和SC,先进行自然连接,然后再执行选择投影操作。



----


π SNO,SNAME(S)CROSS.gif(πSNO(σCNO='C2'(SC)))



自然连接的右分量为"学了C2课的学生学号的集合"。


此表达式比前一个表达式优化,执行起来要省时间、省空间。


************************************

(3) 检索选修课程名为MATHS的学生学号与姓名



------------------------------------


SELECT SC.SNO,S.SNAME


FROM SC,S,C


WHERE SC.SNO=S.SNO


AND SC.CNO=C.CNO


AND C.CNAME='MATHS'


------------------------------------


π SNO,SANME(σCNAME='MATHS'(SCROSS.gifSCCROSS.gifC))


************************************


(4) 检索选修课程号为C2或C4的学生学号



------------------------------------


SELECT SNO


FROM SC


WHERE CNO='C2'


OR CNO='C4'


------------------------------------


π SNO(σ CNO='C2'∨CNO='C4'(SC))


************************************


(5) 检索学习全部课程的学生姓名



------------------------------------


这个定义用SQL表示比较麻烦,略过


------------------------------------


π SNO,CNO(SC)÷πCNO(C)


先用除法取出选取所有课程的SNO集(除法可以理解为一个Filter)


π SNAME(SCROSS.gif (πSNO,CNO(SC)÷πCNO(C)))


再关联S表取出SNAME


************************************


(6) 检索所学课程包含S3所学课程的学生学号



------------------------------------


这个定义用SQL表示比较麻烦,略过


------------------------------------


π SNO,CNO(SC)÷πCNO(σSNO='S3'(SC))


同样运用了除法的特性


************************************


(7) 将新课程元组('C10','PHYSICS','YU')插入到关系C中



------------------------------------


INSERT INTO C VALUES('C10','PHYSICS','YU')


------------------------------------


(C∪('C10','PHYSICS','YU'))


记住该符号的用法


************************************


(8) 将学号S4选修课程号为C4的成绩改为85分



------------------------------------


UPDATE SC SET GRADE=85


WHERE SNO='S4'


AND CNO='C4'


------------------------------------


(SC-('S4','C4',?)∪('S4','C4',85))



先用'-'实现DELETE功能,再用'∪'实现INSERT功能


注意使用?来表示检索时忽略该字段值


************************************

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台