天天看點

資料庫考點之關系代數表達

如題: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)當考慮的問題是

“全部都無”

時則可以從反面入手,在關系代數中利用自然連接配接 + 減法,在元組演算中利用“全稱量詞∀”;