如题:2018年4月
分析:有难度,书上没有明确介绍元组关系演算,所以也有些超纲了。只能作为扩展部分来了解下:
就看懂了前面的部分为广义笛卡尔积定义。
关系代数这部分虽然在2019年10月14日《软考考点之数据库关系运算符含义的理解》中有所涉及,但是相当的不全面的,也很不系统。
其相关出题,一般在SQL设计大题中出,详见《SQL考点之SQL查询、SQL支持数据类型(设计大题)》
1、关系代数的存在的意义:
关系代数(代数方式)、元组关系演算与域关系演算(逻辑方式)代表着关系操作能力,均是抽象的查询语言。用来评估查询语言能力的标准或基础。
2、关系代数操作符:
注:标出的是五种基本的关系操作符,其他操作都由基本操作来定义或导出。
比较和逻辑操作符是专门用来辅助 :“专门的关系运算符”。
3、关系代数之集合运算符
主要是从行的角度进行操作的,并且都是二元操作(都是两个操作数(关系)参与)。
并:书写形式为:R3=R1 U R2,含义为:属于R1和R2,去掉重复元组后的集合R3.
差:R3=R2-R1;含义与概率论一样。
交:R3=R1 ∩ R2;
笛卡尔积:R3=R1 X R2;含义为:R1为m元关系,R2为n元(列)关系,则积为(m+n)个分量的元组,且有mXn个元组。
4、关系代数之专门关系运算符:不仅是行,还有列的操作。
一元操作符,选择和投影,结果是产生一个新的关系,是分解关系的有效方法
选择:表示为σF(R),读作:西格玛 F是条件表达式,R是关系名 形式为:select 关系名 where 条件
投影:πA(R);读作:派 A是属性列,R是关系名。形式为:projection 关系名(属性名1...)
两元操作符:
连接:
读作:西塔,R、S是不同的关系,i代表R的第i列,j代表S的第j列。 θ代表比较运算符。含义为:从R X S中选择第i列与第j列满足 θ的元组,组成一个新的关系。形式为 join 关系名1 and 关系名2 where 条件
其中,自然连接是构造新关系有效方法。何为自然连接呢?
前提还是要有笛卡尔积,从积中找出相同属性列,并把重复的列去掉。得到相同属性列所在笛卡尔积元组即为新的自然连接关系。详见:《软考考点之数据库关系运算符含义的理解》中的例子
除:R1 ÷ R2。若被除有m元关系,除关系为n元关系,则运算结果为m-n元关系。一般来说商关系包含除关系的所有元组,否则就得不到新关系。
扩展:
元组关系演算定义:
元组关系演算中,以元组为单位,通过公式约束所要查找元组的条件,可以表示为: t | ψ(t),使φ(t)为真的元组t的集合。其中: t为元组变量,即查询目的,φ为元组演算的谓词公式,即查询的条件。
按照集合的思想来理解即为:个体词t具有谓词φ(t)的性质。
- 元组关系演算的谓词公式
ψ(t)可以通过原子公式、约束公式、自由变量、运算符构成。
(Ⅰ)原子公式分为三类
①、R(t):R为关系名,表示t是RR中的元组;
②、t[ i ]θu[ j ]:元组t的第i个分量与元组u的第j个分量进行比较运算,运算符号用θ来表示。比如t[ 2 ]<u[ 3 ]。
③、t[ i ]θC:元组的第i个分量与常量C进行比较运算,运算符号用θ来表示。比如t[ 2 ]<5。
(Ⅱ)约束元祖变量 && 自由元组变量
若元组演算公式中的一个元组变量前有“”和“
全称量词
存在量词
”,则称该变量为约束元组变量; 否则称为自由元组变量。
即: 在公式【(∃ t) ψ(t)】和【(∀ t) ψ(t)】中,ψ称为量词的辖域。tt出现在(∃ t)或(∀ t)的辖域内,t为约束元组变量,被量词所绑定。任何没有以这种方法显示绑定的变量都称为自由变量。
(Ⅲ)为此公式ψ(t)的递归定义
①、原子公式是公式;
②、通过吸取连接词、合取连接词所构成的复合公式也是公式。
设ψ1(t1)和ψ2(t2)是公式,则¬ψ1(t1),ψ1(t1) ⋀ ψ2(t2)和ψ1(t1) ⋁ ψ2(t2)也是公式;
③、利用全称量词和存在量词构成的公式也是ψ(t)ψ(t)的一种表现形式 。
【(∃ t) ψ(t)】和【(∀ t) ψ(t)】也是公式;
④、有限次利用上述规则得到的式子都是公式;
- 公式运算符及其优先级
(Ⅰ)算术比较符: <, >, ≥, ≤, ≠, =;
(Ⅱ)全称量词∀和存在量词∃;
(Ⅲ)逻辑运算符: ⋀, ⋁, ¬, ⟶;
(Ⅳ)优先级: 算术比较符 > 全称量词∀和存在量词∃ > 逻辑运算符;
- 元组关系演算与关系代数
在元组关系演算中,可以不用考虑为解决表的自然连接中产生数据冗余而进行投影属性列。
(注意:最好还是考虑,但是为了简化步骤就没有考虑)。
Ⅰ)
到
传统关系代数
元组关系演算
①、交操作:{t|R(t) ⋀ S(t)}{t|R(t) ⋀ S(t)};
②、并操作:{t|R(t) ⋁ S(t)}{t|R(t) ⋁ S(t)};
③、差操作:{t|R(t) ⋀ ¬S(t)}{t|R(t) ⋀ ¬S(t)};
④、广义笛卡尔积操作:{ t(m+n) | (∃u)(∃v) (R(u)ΛS(v)) ⋀ (t[ i ]=u[ j ] (i=1,2,...,m) ⋀ t[ i ]=v[ k ]) }{ t(m+n) | (∃u)(∃v) (R(u)ΛS(v)) ⋀ (t[ i ]=u[ j ] (i=1,2,...,m) ⋀ t[ i ]=v[ k ]) },
其中(i=m+1,m+2,...,m+n) (j=1,2,...,m) (k=1,2,...,n)}(i=m+1,m+2,...,m+n) (j=1,2,...,m) (k=1,2,...,n)};
(Ⅱ)
到
专门关系代数
元组关系演算
(1) 选择操作:{t | R(t) ⋀ F}{t | R(t) ⋀ F},其中FF是指查询条件。选取操作只是在原有的表上,将满足特定性质的元组提取出来,并没有形成新的表。
(2)投影操作: {t(n) | (∃u) (R(u) ⋀ t[ i ] = u[ j ])}{t(n) | (∃u) (R(u) ⋀ t[ i ] = u[ j ])},其中(i=1,2,...,n,j∈[1,countA(R)])(i=1,2,...,n,j∈[1,countA(R)])。
即为,∃u ∈ R∃u ∈ R,满足t[ 1 ] = u[ 1 ]t[ 1 ] = u[ 1 ]。投影是建立了一个新的表,这个表中的列来自于原表中的属性列(感兴趣的、被选取出来的列)。
补充
:
投影用存在量词∃的原因
- 浅析打开全称量词∀和存在量词∃的方式
(Ⅰ)存在量词∃:当需求中含有“存在一个”、“至少一个”、“有一个”等词的时候。就像上述的投影操作一样:有且仅有一个RR中的uu元组,满足t[ i ] = u[ j ]t[ i ] = u[ j ]。
(Ⅱ)全称量词∀:当需求中含有“全部”、“所有”等词,并且将“全部”一词去掉有后改变原句句意的时候。eg:
①、“在进行操作的过程中选择某一集合中全部元素”的元素集合时,即此时的“全部”并不是默认值,默认值为“至少一个 / 存在”,比如说某个要求为:“查询选修了全部课程的学生”,此时将“全部”一词去掉后变为“查询选修了课程的学生”,不难发现,前一个是“选修了全部课程”,后一个是“只要是选修了课程,即至少选修了一门课程”,将两者比较,两句话的句意完全不同。
②、在经过一系列操作后所得到的集合中选择全部元组时,即此时的“全部”为默认值:对于“查询选修了‘刘伟’老师的课程的全部学生”,将“全部”一词去掉后变为“查询选修了‘刘伟’老师的课程的学生”,这并没有lenlen何差别,所以自然就“不配”使用“全称量词∀”了。
补充
:
关于“投影中使用‘存在量词∃’的另一角度的理解”:“将所有的元组投影到属性列上”,把“所有的”一词去掉变为“将元组投影到属性列上”,显然这两句话其实是一样的意思。
- 命题的否定 VS 否命题
存在一个命题为:若p,则q。
(Ⅰ)命题的否定: 若p,则¬q。(√)
也就是说,命题的否定只会否定命题的结论,并不会否定命题的条件。简单来说就是与原命题唱反调,所以他与原命题是完全对立的。所以我们研究问题的时候用的“正难则反”就是研究问题的否定形式¬q¬q。
(Ⅱ)否命题: 若¬p,则¬q。(PASS)
也就是说,否命题会把命题的条件和结论一起否定掉。他与原命题的真假无关,与逆命题同真同假。
(Ⅲ)全称量词∀和存在量词∃的否定形式
(1)全称量词∀的否定形式
①、更换量词: 将全称量词∀换成存在量词∃;
②、将结论否定;
也就是说: 全称量词∀的否定是一个存在命题。
(2)存在量词∃的否定形式
①、更换量词: 将存在量词∃换成全称量词∀;
②、将结论否定;
也就是说: 存在量词∃的否定是一个全称命题;
- 总结,深入全称量词∀和存在量词∃的打开方式
研究“全称量词∀和存在量词∃”本质上就是研究“集合”的有关问题,所以要先把握住集合与集合之间的关系。任何两个集合的关系有且仅可能有3种:相交、包含、相离,并且这三种关系又有如下的关系:
(1)“相离” 与“相交”∪“包含”:互为对立事件,即“全部都没” VS “至少有一”;
(2)“包含” 与“相交”∪“相离”:互为对立事件,即“全部都有” VS “至少没一”;
了解了这个后,我们就可进一步的归纳出使用"全称量词∀和存在量词∃"的情景:
(1)当某个事件被表述为两个集合“相离”或者“包含”的时候 :使用“全称量词∀”来表示“全部都没”或者“全部都有”;
(2)当某个事件被表述为两个集合“相交”的时候:使用“存在量词∃”来表达“至少有一”或者“至少没一”;
举个栗子 :
(1)
相离
:“没有选修过‘李力’老师教授的课程的同学”这个问题就可以被表述为:“Ai∩B=ϕ”,其中Ai = {第i个学生的“学生-选课信息”的课程编号集合},B = {‘李力’老师教授的课程的课程编号集合};
(2)
相交
:“选修过‘李力’老师教授的课程的同学”这个问题就可以被表述为:“Ai∩B≠ϕ”,其中Ai = {第ii个学生的“学生-选课信息”的课程编号集合},B = {‘李力’老师教授的课程的课程编号集合};
(3)
包含
:“选修了‘李力’老师教授的全部课程的同学”这个问题就可以被表述为:“Ai ⊇ B”,其中Ai = {第i个学生的“学生-选课信息”的课程编号集合},B = {‘李力’老师教授的课程的课程编号集合};
从“正”、“反”两个方面考虑问题的角度来说:
(1)当考虑的问题是
“全部都有”
时则可以从正面入手,在关系代数中利用除法,在元组演算中利用
“全称量词∀”
;
(2)当考虑的问题是
“至少没有一个”
时则可以从反面入手,在关系代数中利用除法 + 减法,在元组演算则从正面入手,直接利用
“存在量词∃”
,译作“存在一个没有满足……”;
(3)当考虑的问题是
“至少存在一个”
时则可以从正面入手,在关系代数中利用自然连接,在元组演算中利用“存在量词∃”,译作“存在一个满足……”;
(4)当考虑的问题是
“全部都无”
时则可以从反面入手,在关系代数中利用自然连接 + 减法,在元组演算中利用“全称量词∀”;