- 數(shù)據(jù)庫原理及應(yīng)用:SQL Server 2016
- 賈鐵軍 徐方勤主編
- 4518字
- 2021-03-19 20:15:19
2.3 常用的關(guān)系運(yùn)算
數(shù)據(jù)庫中的查詢操作是在實(shí)際應(yīng)用中最常用的基本操作,用戶可以從數(shù)據(jù)庫中獲得感興趣的數(shù)據(jù)。關(guān)系代數(shù)是一種抽象的查詢語言,以集合代數(shù)為基礎(chǔ),以關(guān)系為運(yùn)算對象的高級運(yùn)算。關(guān)系運(yùn)算與傳統(tǒng)的運(yùn)算相同,也是一種運(yùn)算,包括運(yùn)算對象、運(yùn)算符和運(yùn)算結(jié)果三大要素。關(guān)系代數(shù)的運(yùn)算對象和運(yùn)算結(jié)果都是關(guān)系。下面對關(guān)系運(yùn)算的種類和運(yùn)算符進(jìn)行簡要描述。
2.3.1 關(guān)系運(yùn)算符和運(yùn)算種類
1.關(guān)系運(yùn)算符
關(guān)系運(yùn)算的運(yùn)算符主要包括4類:集合運(yùn)算符、專門的關(guān)系運(yùn)算符、算術(shù)比較運(yùn)算符和邏輯運(yùn)算符。下面只是簡單羅列上述4類運(yùn)算符,至于具體的使用方法將在后面章節(jié)中進(jìn)行介紹。
1)集合運(yùn)算符:∪(并運(yùn)算)、—(差運(yùn)算)、∩(交運(yùn)算)、×(笛卡兒積)。
2)專門的關(guān)系運(yùn)算符:σ(選擇)、π(投影)、?(連接)、÷(除)。
3)(算術(shù))比較運(yùn)算符:>(大于)、≥(大于等于)、<(小于)、≤(小于等于)、=(等于)、≠(不等于)。
4)邏輯運(yùn)算符:﹁(非)、∧(與)、∨(并)。
2.關(guān)系運(yùn)算種類
關(guān)系運(yùn)算的種類可分為兩類,即傳統(tǒng)的關(guān)系運(yùn)算和專門的關(guān)系運(yùn)算。傳統(tǒng)的關(guān)系運(yùn)算將關(guān)系看作元組的集合,即關(guān)系運(yùn)算的方向是按照“水平”方向行的角度來進(jìn)行,而專門的關(guān)系運(yùn)算不僅涉及行,而且涉及列。
(1)傳統(tǒng)的集合運(yùn)算
主要使用傳統(tǒng)的集合運(yùn)算方法,將關(guān)系(表)作為行(元組)的集合,從關(guān)系(表)的行方向角度進(jìn)行運(yùn)算。有時需要兩個關(guān)系進(jìn)行運(yùn)算,如找到兩個表中相同的部分,這種運(yùn)算類似于傳統(tǒng)集合運(yùn)算中的交運(yùn)算。
傳統(tǒng)的集合運(yùn)算可以實(shí)現(xiàn)的基本操作如下。
1)并運(yùn)算,實(shí)現(xiàn)數(shù)據(jù)的插入和添加。
2)差運(yùn)算,實(shí)現(xiàn)數(shù)據(jù)記錄的刪除。
3)修改數(shù)據(jù)記錄的操作,由先刪除(差)后插入(并)兩個操作實(shí)現(xiàn)。
(2)專門的關(guān)系運(yùn)算
專門的關(guān)系運(yùn)算是針對關(guān)系數(shù)據(jù)庫環(huán)境專門設(shè)計(jì)的,不僅涉及關(guān)系的行(元組或記錄),也涉及關(guān)系的列(屬性)。比較運(yùn)算符和邏輯運(yùn)算符實(shí)現(xiàn)輔助專門的關(guān)系運(yùn)算符操作。有時需要關(guān)系(表)本身進(jìn)行運(yùn)算,如果需要顯示表中某列的值,就需要利用關(guān)系的專門運(yùn)算中的“投影”。
2.3.2 傳統(tǒng)的關(guān)系運(yùn)算
事實(shí)上,傳統(tǒng)的關(guān)系運(yùn)算屬于集合運(yùn)算,即對兩個關(guān)系的二目集合運(yùn)算。傳統(tǒng)的關(guān)系運(yùn)算主要包括4種:并、差、交和廣義笛卡兒積。
1.并運(yùn)算
設(shè)關(guān)系R和關(guān)系S具有相同的目n(即兩個關(guān)系具有n個屬性),且相應(yīng)的屬性取自同一個域,則關(guān)系R和關(guān)系S的并(Union)由屬于R或?qū)儆赟的元組組成。其結(jié)果關(guān)系的屬性數(shù)仍為n,記為R∪S。形式化定義為
R∪S={t|t∈R∨t∈S}
其中,t表示關(guān)系R或S中的元組,即關(guān)系R或S中的記錄行。
注意:
R∪S的結(jié)果集合是R中元組和S中元組合并在一起構(gòu)成的一個新關(guān)系,特別要指出的是,合并后的結(jié)果必須要去除重復(fù)元組。
【案例2-10】已知關(guān)系R和關(guān)系S如表2-3和表2-4所示,求關(guān)系R和關(guān)系S的并集(R∪S)。
表2-3 關(guān)系R

表2-4 關(guān)系S

關(guān)系R和關(guān)系S的并集結(jié)果如表2-5所示。
表2-5 R∪S結(jié)果

2.差運(yùn)算
設(shè)關(guān)系R和關(guān)系S具有相同的目n(即兩個關(guān)系具有n個屬性),且相應(yīng)的屬性取自同一個域,則關(guān)系R和關(guān)系S的差(Difference)由屬于R但不屬于S的元組組成。其結(jié)果關(guān)系的屬性數(shù)仍為n,記為R-S。形式化定義為
R-S={t|t∈R∧t?S}
其中,t表示關(guān)系R或S中的元組,即關(guān)系R或S中的記錄行。
【案例2-11】已知關(guān)系R和關(guān)系S如表2-3和表2-4所示,求關(guān)系R和S的差。R-S的結(jié)果如表2-6所示。
表2-6 關(guān)系R-S

3.交運(yùn)算
設(shè)關(guān)系R和關(guān)系S具有相同的目n(即兩個關(guān)系具有n個屬性),且相應(yīng)的屬性取自同一個域,則關(guān)系R和關(guān)系S的交(Intersection)由屬于R且屬于S的元組組成。其結(jié)果關(guān)系的屬性數(shù)仍為n,記為R∩S。形式化定義為
R∩S={t|t∈R∧t∈S}
其中,t表示關(guān)系R或S中的元組,即關(guān)系R或S中的記錄行。
【案例2-12】已知關(guān)系R和關(guān)系S如表2-3和表2-4所示,求關(guān)系R和S的交。R∩S的結(jié)果如表2-7所示。

表2-7 關(guān)系R∩S

4.廣義笛卡兒積
設(shè)關(guān)系R和關(guān)系S的屬性數(shù)分別為r和s。關(guān)系R和S的廣義笛卡兒積(Extended Cartesian)R×S 是一個(r+s)目的元組集合(即新關(guān)系的屬性數(shù)為:r+s),每個元組前r個分量(屬性值)來自關(guān)系R的一個元組,后s個分量是關(guān)系S的一個元組。關(guān)系R和關(guān)系S的笛卡兒積記為R×S,其形式化定義為
R×S={t|t=<tr,ts>∧tr∈R∧ts∈S}
說明:tr、ts中的r、s為上標(biāo),分別表示r個分量和s個分量。若關(guān)系R的元組數(shù)為k1,關(guān)系S的元組數(shù)為k2,則關(guān)系R和關(guān)系S的笛卡兒積的元組數(shù)為k1×k2。
【案例2-13】已知關(guān)系R和關(guān)系S如表2-4和表2-8所示,求關(guān)系R和S的笛卡兒積。R×S的結(jié)果如表2-9所示。
表2-8 關(guān)系S

表2-9 R×S結(jié)果

關(guān)系R和關(guān)系S中有相同的屬性名“學(xué)號”,在計(jì)算結(jié)果中為了區(qū)分,需要在其屬性名前標(biāo)注相應(yīng)的關(guān)系名,如R.學(xué)號和S.學(xué)號。
注意:在實(shí)際的應(yīng)用,笛卡兒積本身沒有多少實(shí)際用處,只有兩表連接時加上限制條件,才會有實(shí)際意義。
2.3.3 專門的關(guān)系運(yùn)算
專門的關(guān)系運(yùn)算主要包括4種:選擇運(yùn)算、投影運(yùn)算、連接運(yùn)算和除運(yùn)算。其中選擇運(yùn)算可以選取符合條件的元組構(gòu)成新關(guān)系;投影運(yùn)算可選取元組中指定的屬性構(gòu)成新關(guān)系;連接運(yùn)算可選取符合條件的元組串聯(lián)成新關(guān)系;除運(yùn)算可選取象集符合條件的元組的多個屬性構(gòu)成新關(guān)系。
1.選擇(Selection)運(yùn)算
選擇運(yùn)算也稱限制(Restriction),是對二維表進(jìn)行水平分割,也可以理解為對記錄(元組)水平方向的選取。選擇是在表中選取符合給定條件的元組,記為σF(R)。其中,σ為選擇運(yùn)算符,F(xiàn)表示選擇條件,是一個邏輯表達(dá)式,F(xiàn)的取值為邏輯值“真”或“假”。
邏輯表達(dá)式F的基本形式為:XθY,其中θ表示比較運(yùn)算,它可以是>、≥、<、≤、=、≠。X和Y表示屬性名,或?yàn)槌A浚驗(yàn)楹唵魏瘮?shù);屬性名可以用它的序號來替代。在基本的選擇條件中可以進(jìn)一步進(jìn)行邏輯運(yùn)算,進(jìn)行求非(﹁)、與(∧)、或(∨)運(yùn)算。
選擇運(yùn)算是從行的角度進(jìn)行的運(yùn)算,也就是從關(guān)系R中選取使邏輯表達(dá)式F為真的元組,也可以理解為從數(shù)據(jù)表中選取符合某種條件的記錄生成新的關(guān)系集合。σF(R)表示從R中選取滿足公式F的元組(行或記錄)所構(gòu)成的新關(guān)系。其形式化定義如下。
σF(R)={t|t∈R∧F(t)=true}
【案例2-14】在商品信息表(見表2-10)查詢出所有產(chǎn)地為“深圳”的商品信息。選擇運(yùn)算σ產(chǎn)地='深圳'(商品信息表)或σ8='深圳'(商品信息表),其結(jié)果表2-11所示。
表2-10 商品信息表

表2-11 產(chǎn)地為“深圳”選擇結(jié)果

【案例2-15】查詢商品價(jià)格低于500元的商品信息。選擇運(yùn)算σ價(jià)格<500(商品信息表)或σ3<500(商品信息表),其結(jié)果如表2-12所示。
表2-12 價(jià)格低于500選擇運(yùn)算結(jié)果

2.投影(Projection)運(yùn)算
投影運(yùn)算是對關(guān)系(表)進(jìn)行垂直分割,即對記錄(元組)列方向的篩選。
投影(Projection)運(yùn)算是在一個關(guān)系中選取某些屬性或列,并重新排列屬性的順序,再刪掉重復(fù)元組后構(gòu)成的新關(guān)系,是對二維表進(jìn)行垂直分割,記為πA(R)。其中,π為投影運(yùn)算符,A為關(guān)系R中的屬性列。
投影運(yùn)算的形式化定義如下。
πA(R)={t[A]|t∈R}
【案例2-16】已知商品信息表如2-10所示,查詢商品的產(chǎn)地信息。
投影運(yùn)算π產(chǎn)地(商品信息表)或πg(商品信息表)的結(jié)果如表2-13所示。

表2-13 投影“產(chǎn)地”運(yùn)算結(jié)果

【案例2-17】已知商品信息表如2-10所示,查詢商品的名稱和價(jià)格信息。投影π商品名稱、價(jià)格(商品信息表)或π2.3(商品信息表)的結(jié)果如表2-14所示。
表2-14 投影“商品名稱”和“價(jià)格”運(yùn)算結(jié)果

3.連接(Join)運(yùn)算
連接又稱θ連接,是從兩個關(guān)系的笛卡兒積中選取屬性間滿足一定條件的元組。形式化定義如下。

其中,A和B分別為關(guān)系R和關(guān)系S上度數(shù)相同且可比的屬性組,θ為比較運(yùn)算符。連接運(yùn)算從R和S的笛卡兒積R×S中選取R關(guān)系在A屬性組上的值與S關(guān)系在B屬性組上值滿足比較關(guān)系θ的元組。
連接運(yùn)算中有兩種最常用的連接,一種是等值連接(Equijoin),另一種是自然連接(Natural Join)。
1)等值連接。θ為“=”的連接運(yùn)算稱為等值連接。等值連接從關(guān)系R和關(guān)系S與廣義笛卡兒積中選取A、B屬性相等的元組,即等值連接為

2)自然連接。是一種特殊的等值連接。它要求兩個關(guān)系中進(jìn)行比較的分量必須是相同的屬性組,并且在結(jié)果中把重復(fù)的屬性列去掉。如果關(guān)系R和S具有相同的屬性組B,則自然連接可記為

注意:一般的連接操作是從行的角度進(jìn)行運(yùn)算。但自然連接還需要取消重復(fù)列,所以是同時從行和列的角度進(jìn)行的運(yùn)算。
【案例2-18】設(shè)關(guān)系R(見表2-15)和關(guān)系S(見表2-16),求、
和R??S。
表2-15 關(guān)系R

表2-16 關(guān)系S

、
和R??S的結(jié)果如表2-17~表2-19所示。
表2-17 關(guān)系

表2-18

表2-19 R??S

自然連接與等值連接的主要區(qū)別如下。
1)等值連接中相等的屬性可以是相同屬性,也可以是不同屬性,而自然連接中相等的屬性必須是相同的屬性。
2)自然連接的連接結(jié)果必須去除重復(fù)屬性,而等值連接的結(jié)果不需要去除重復(fù)屬性。
3)自然連接用于有公共屬性的情況。若兩個關(guān)系沒有公共屬性,則它們不能進(jìn)行自然連接,而等值連接無此要求。自然連接在多表數(shù)據(jù)調(diào)用時常用。
4.除運(yùn)算(Division)
給定關(guān)系R(X,Y)和S(Y,Z),其中X、Y、Z為屬性組。R中的Y與S中的Y可以有不同的屬性名,但必須出自相同的域集。
R與S的除運(yùn)算得到一個新的關(guān)系P(X),P是R中滿足下列條件的元組在X屬性列上的投影:元組在X上的分量值x的象集Yx包含S在Y上投影的集合。記作
R÷S={tr[X]tr∈R∧πY(S)?YX|}
其中YX為x在R中的象集,x=tr[X]。
除運(yùn)算一般會對行和列角度進(jìn)行操作。
除運(yùn)算的計(jì)算可按下列過程進(jìn)行。
1)將被關(guān)系的屬性分為象集和結(jié)果屬性兩部分,與除關(guān)系相同的屬性歸于象集,不相同的屬性歸于結(jié)果集。
2)在除關(guān)系中,在與被除關(guān)系相同的屬性(象集屬性)上投影,得到除目標(biāo)數(shù)據(jù)集。
3)將被除關(guān)系分組,將結(jié)果屬性值相同的元組分為一組。
4)觀察每個組,若它的象集屬性值中包括除目標(biāo)數(shù)據(jù)集,則對應(yīng)的結(jié)果屬性值應(yīng)該屬于除法運(yùn)算結(jié)果集,并去掉與原被除關(guān)系相同的分組。
【案例2-19】(數(shù)據(jù)庫系統(tǒng)工程師2005年5月試題44),已知關(guān)系R(見表2-20)和關(guān)系S(見表2-21),求R÷S。
表2-20 關(guān)系R

表2-21 關(guān)系S

具體計(jì)算過程如下。
1)關(guān)系R中屬性組A、B的取值為{(2,1),(2,2),(3,2)}
(2,1)的象集為{(a,c),(b,d)}。
(2,2)的象集為{(a,d)}。
(3,2)的象集為{(b,d),(b,c)}
2)關(guān)系S在屬性組C、D上的投影為{(a,c),(b,d)}
3)找出全部屬性組A、B象集包含關(guān)系S屬性組C、D上的投影的取值,即為新關(guān)系R÷S,此處通過比較(1)和(2),可以發(fā)現(xiàn)只有元組(2,1)的象集包含關(guān)系S在屬性組C、D上的投影,所以R÷S只有一個元組(2,1),即R÷S運(yùn)算結(jié)果如表2-22所示。
表2-22 R÷S

除的基本運(yùn)算可以表示為等價(jià)關(guān)表達(dá)式
πA(R)-πA(πA(R)×S-R)
下面試舉幾個關(guān)系代數(shù)綜合運(yùn)算應(yīng)用的案例。
設(shè)商品銷售數(shù)據(jù)庫有3個關(guān)系:商品關(guān)系、售貨員關(guān)系和售貨關(guān)系。3個關(guān)系的關(guān)系模式如下。

商品(商品編號,商品名,產(chǎn)地,價(jià)格,等級)
售貨員(售貨號編號,姓名,性別,年齡)
售貨(商品編號,售貨員編號,數(shù)量)
【案例2-20】查詢所有產(chǎn)地為北京的商品信息。
σ產(chǎn)地='北京'(商品)
查詢年齡35歲以下男性的售貨員編號和姓名。
π售貨員編號,姓名(σ年齡<35∧性別='男'(售貨員))
查詢售出商品編號為K006的售貨員姓名。
π姓名(σ商品編號='K006'(售貨??售貨員))
討論思考:
1)交、并、差運(yùn)算的兩個關(guān)系必須滿足什么條件?
2)除運(yùn)算的結(jié)果表示什么含義?
3)等值連接和自然連接之間的區(qū)別是什么?
- 數(shù)據(jù)庫基礎(chǔ)教程(SQL Server平臺)
- 漫話大數(shù)據(jù)
- PyTorch深度學(xué)習(xí)實(shí)戰(zhàn):從新手小白到數(shù)據(jù)科學(xué)家
- Creating Mobile Apps with Sencha Touch 2
- 新型數(shù)據(jù)庫系統(tǒng):原理、架構(gòu)與實(shí)踐
- Python數(shù)據(jù)分析:基于Plotly的動態(tài)可視化繪圖
- 大數(shù)據(jù)營銷:如何讓營銷更具吸引力
- 城市計(jì)算
- 智能數(shù)據(jù)分析:入門、實(shí)戰(zhàn)與平臺構(gòu)建
- 中國數(shù)字流域
- 數(shù)據(jù)庫技術(shù)實(shí)用教程
- Scratch 2.0 Game Development HOTSHOT
- 從Lucene到Elasticsearch:全文檢索實(shí)戰(zhàn)
- 數(shù)據(jù)庫原理及應(yīng)用:SQL Server 2016
- 一類智能優(yōu)化算法的改進(jìn)及應(yīng)用研究