一、
|
元組關(guān)系演算
|
1。 |
元組關(guān)系演算概念
在元組關(guān)系演算系統(tǒng)中,稱(chēng)
{t|Φ(t)}
為元組演算表達(dá)式。其中t是元組變量,Φ(t)為元組關(guān)系演算公式,簡(jiǎn)稱(chēng)公式。它由原子公式和運(yùn)算符組成。
|
2。 |
原子公式
(1) R(t)
R是關(guān)系名,t是元組變量。R(t)表示t是R中的元組。于是,關(guān)系R可表為:
{t|R(t)}
(2) T[i]θu[j]
t和u是元組變量,θ是算術(shù)比較運(yùn)算符。T[i]θu[j]表示“元組t的第i個(gè)分量與元組u的第j個(gè)分量滿(mǎn)足比較關(guān)系θ”。例如,t[2]<u[3]表示元組t的第2個(gè)分量小于元組u的第3個(gè)分量。
(3) t[i]θc或cθt[i]
這里c是常量,該公式表示“t的第i個(gè)分量與常量c滿(mǎn)足比較關(guān)系θ”。例如,t[4]=3表示元組t的第4個(gè)分量等于3。
|
3。 |
若公式中的一個(gè)元組變量前有“全稱(chēng)量詞 P (universal quantifier)”或“存在量詞 v(existential quantifier)”,則稱(chēng)該變量為約束元組變量,否則稱(chēng)自由元組變量。
|
4。 |
公式遞歸定義
定義:
(l) 每個(gè)原子公式是公式。
(2) 如果Φ1和Φ2是公式,則Φ1∧Φ2, Φ1∨Φ2,┓Φ1也是公式。表示:
·如果Φ1和Φ2同時(shí)為真,則Φ1∧Φ2才為真,否則為假;
·如果Φ1和Φ2中一個(gè)或同時(shí)為真,則Φ1∨Φ2為真,僅當(dāng)Φ1和Φ2同時(shí)為假
時(shí), Φ1∨Φ2才為假;
·若Φ1為真,則┓Φ1為假。
(3) 若Φ是公式,則 vt(Φ)也是公式。v t(Φ)表示:若有一個(gè)t使Φ為真,
則 vt(Φ)為真,否則 vt(Φ)為假。
(4) 若Φ是公式,則 Pt(Φ)也是公式。P t(Φ)表示:如果對(duì)所有t,都使Φ
為真,則 Pt(Φ)為真,否則 Pt(Φ)為假。
(5) 在元組演算公式中,各種運(yùn)算符的優(yōu)先次序?yàn)?/span>:
( )—> 算術(shù)比較運(yùn)算符—> v—> P—> ┓—> ∧—> ∨
(6)有限次地使用上述五條規(guī)則得到的公式是元組關(guān)系演算公式,其他公式不是元組關(guān)系演算公式。
|
5。 |
元組關(guān)系演算表達(dá)式表示關(guān)系代數(shù)的基本運(yùn)算
一個(gè)元組演算表達(dá)式{t|Φ(t)}表示了使Φ(t)為真的元組集合。關(guān)系代數(shù)的運(yùn)算均可以用關(guān)系演算表達(dá)式來(lái)表示(反之亦然)。下面用關(guān)系演算表達(dá)式來(lái)表示五種基本運(yùn)算:
(1) 并
R∪S={t︳R(t) ∨s(t)}
(2) 差:
R—S={t︱R(t) ∧┓S(t)}
(3) 笛卡兒積
R×S={t(n+m)︱(vu(n))( vv(m))(R(u) ∧S(v) ∧t[1]=u[1] ∧……∧t[n]=u[n] ∧ t[n+1]=v[1] ∧……∧t[n+m]=v[m])}
這里t(n+m) 表示t有數(shù)目(n+m)
(4) 投影
πi1,i2,…….,ik®={t(k)︱(vu)(R(u) ∧t[1]=u[i1] ∧……t[k]=u[ik])}
(5) 選擇:
σF(R)={t︱R(t) ∧F’}
F‘是公式F用t[i]代替運(yùn)算對(duì)象i得到的等價(jià)公式。
例1查詢(xún)信息系(IS系)全體學(xué)生。
SIS={t︱Student(t) ∧t[5]=’ IS’}
例2查詢(xún)年齡小于20歲的學(xué)生。
S20={t︱Student(t) ∧t[4]<20}
例3查詢(xún)學(xué)生的姓名和所在系。
S1={t(2)︱(vu)(Student(u) ∧t[1]=u[2] ∧t[2]=u[5])}
|
6。 |
關(guān)系演算的安全限制
上面定義的關(guān)系演算允許出現(xiàn)無(wú)限關(guān)系。例如,{t|┓R(t)}表示所有不屬于R的元組(元組的目數(shù)等于R的目數(shù))。要求出這些可能的元組是做不到的,所以必須排除這類(lèi)無(wú)意義的表達(dá)式。把不產(chǎn)生無(wú)限關(guān)系的表達(dá)式稱(chēng)為安全表達(dá)式,所采取的措施稱(chēng)為安全限制。
安全限制通常是定義一個(gè)有限的符號(hào)集dom(Φ)。dom(Φ)一定包括出現(xiàn)在Φ以及中間結(jié)果和最后結(jié)果的關(guān)系中的所有符號(hào)(實(shí)際上是各列中值的匯集)。dom(Φ)不必是最小集。
當(dāng)滿(mǎn)足下列條件時(shí),元組演算表達(dá)式{t|Φ(t)}是安全的:
(1) 如果t使Φ(t)為真,則t的每個(gè)分量是dom(Φ)中的元素。
(2) 對(duì)于Φ中每一個(gè)形如(vu)(W(u))的子表達(dá)式,若u使W(u)為真,則u的每個(gè)分量是dom(Φ)中的元素。
(3) 對(duì)于Φ中每一個(gè)形如(Pu)(W(u))的子表達(dá)式,若u使W(u)為假,則u的每個(gè)分量必屬于dom(Φ)。換言之,若u某一分量不屬于dom(Φ),則W(u)為真。
例4 設(shè)有關(guān)系R如圖2.8(a),S={t|┓R(t)},若不進(jìn)行安全限制,則可能是一個(gè)無(wú)限關(guān)系。所以定義
dom(Φ)= πA(R) ∪πB∪πC(R)
={{a1,a2},{b1,b2},{c1,c2}}
則S是dom(Φ)中各域值中元素的笛卡兒積與R的差集。結(jié)果如圖2.8(b)。注意,在做笛卡兒積是各個(gè)域中的元素不能搞混。
|
二、 |
元組關(guān)系演算語(yǔ)言ALPHA
元組關(guān)系演算以元組變量作為謂詞變?cè)幕緦?duì)象。一種典型的元組關(guān)系演算語(yǔ)言是E.F.Codd提出ALPHA語(yǔ)言,這一語(yǔ)言雖然沒(méi)有實(shí)際實(shí)現(xiàn),但關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)INGRES所用的QUEL語(yǔ)言是參照ALPHA語(yǔ)言研制的,與ALPHA十分類(lèi)似。
ALPHA語(yǔ)言主要有GET、PUT、HOLD、UPDATE、DELETE、DROP六條語(yǔ)句,語(yǔ)句的基本格式是: 操作語(yǔ)句 工作空間名(表達(dá)式): 操作條件
其中表達(dá)式用于指定語(yǔ)句的操作對(duì)象,它可以是關(guān)系名或?qū)傩悦?,一條語(yǔ)句可以同時(shí)操作多個(gè)關(guān)系或多個(gè)屬性。操作條件是一個(gè)邏輯表達(dá)式,用于將操作對(duì)象限定在滿(mǎn)足條件的元組中,操作條件可以為空。除此之外,還可以在基本格式的基礎(chǔ)上加上排序要求,定額要求等。
以下仍以P58的實(shí)例討論ALPHA語(yǔ)言:
|
1、
|
檢索操作
|
|
檢索操作用GET語(yǔ)句實(shí)現(xiàn)。
|
|
(1)簡(jiǎn)單檢索(即不帶條件的檢索)
|
|
舉例
|
|
例1 查詢(xún)所有被選修課程的課程號(hào)碼 GET W (SC.Cno) 這里條件為空,表示沒(méi)有限定條件。W為工作空間名。 例2 查詢(xún)所有學(xué)生的數(shù)據(jù) GET W (Student)
|
|
(2)限定的檢索(即帶條件的檢索)
|
|
舉例
|
|
例3 查詢(xún)信息系(IS)中年齡小于20歲的學(xué)生的學(xué)號(hào)和年齡 GET W (Student.Sno, Student.Sage): Student.Sdept=‘IS‘ ∧ Student.Sage<20v
|
|
(3)帶排序的檢索
|
|
舉例
|
|
例4 查詢(xún)計(jì)算機(jī)科學(xué)系(CS)學(xué)生的學(xué)號(hào)、年齡,并按年齡降序排序 GET W (Student.Sno, Student.Sage): Student.Sdept=‘CS‘ DOWN Student.Sage
|
|
(4)帶定額的檢索
|
|
舉例
|
|
例5 取出一個(gè)信息系學(xué)生的學(xué)號(hào) GET W (1) (Student.Sno): Student.Sdept=‘IS‘ 所謂帶定額的檢索是指指定檢索出元組的個(gè)數(shù),方法是在W后括號(hào)中加上定額數(shù)量。 排序和定額可以一起使用。 例6 查詢(xún)信息系年齡最大的三個(gè)學(xué)生的學(xué)號(hào)及其年齡 GET W (3) (Student.Sno, Student.Sage): Student.Sdept=‘IS‘ DOWN Student.Sage
|
|
(5)用元組變量的檢索
|
|
詳細(xì)信息…
|
|
因?yàn)樵M變量是在某一關(guān)系范圍內(nèi)變化的,所以元組變量又稱(chēng)為范圍變量(Range variable)。元組變量主要有兩方面的用途: ① 簡(jiǎn)化關(guān)系名。在處理實(shí)際問(wèn)題時(shí),如果關(guān)系的名字很長(zhǎng),使用起來(lái)就會(huì)感到不方便,這時(shí)我們可以設(shè)一個(gè)較短名字的元組變量來(lái)簡(jiǎn)化關(guān)系名。 ② 操作條件中使用量詞時(shí)必須用元組變量。 元組變量是動(dòng)態(tài)的概念,一個(gè)關(guān)系可以設(shè)多個(gè)元組變量。 例7 查詢(xún)信息系學(xué)生的名字 RANGE Student X GET W (X.Sname): X.Sdept=‘IS‘ 這里元組變量X的作用是簡(jiǎn)化關(guān)系名Student。
|
|
(6)用存在量詞的檢索
|
|
舉例
|
|
例8 查詢(xún)選修2號(hào)課程的學(xué)生名字 RANGE SC X GET W (Student.Sname): ヨX(X.Sno=Student.Sno ∧ X.Cno=‘2‘)
例9 查詢(xún)選修了其直接先行課是6號(hào)課程的課程的學(xué)生學(xué)號(hào) RANGE Course CX GET W (SC.Sno): ヨCX (CX.Cno=SC.Cno ∧ CX.Pcno=‘6‘) 例10 查詢(xún)至少選修一門(mén)其先行課為6號(hào)課程的學(xué)生名字 RANGE Course CX SC SCX GET W (Student.Sname): ヨSCX (SCX.Sno=Student.Sno ∧ ヨCX (CX.Cno=SC.Cno ∧ CX.Pcno=‘6‘)) 本例中的元組關(guān)系演算公式可以變換為前束范式(Prenex normal form)的形式: GET W (Student.Sname): ヨSCXヨCX (SCX.Sno=Student.Sno ∧ CX.Cno=SCX.Cno ∧ CX.Pcno=‘6‘) 例8、例9、例10中的元組變量都是為存在量詞而設(shè)的。其中例10需要對(duì)兩個(gè)關(guān)系作用存在量詞,所以設(shè)了兩個(gè)元組變量。
|
|
(7)帶有多個(gè)關(guān)系的表達(dá)式的檢索
|
|
舉例
|
|
(1) 上面所舉的各個(gè)例子中,雖然查詢(xún)時(shí)可能會(huì)涉及多個(gè)關(guān)系,即公式中可能涉及多個(gè)關(guān)系,但查詢(xún)結(jié)果都只在一個(gè)關(guān)系中,即表達(dá)式中只有一個(gè)關(guān)系。實(shí)際上表達(dá)式中是可以有多個(gè)關(guān)系的。 例11 查詢(xún)成績(jī)?yōu)?0分以上的學(xué)生名字與課程名字 本查詢(xún)所要求的結(jié)果學(xué)生名字和課程名字分別在Student和Course兩個(gè)關(guān)系中。 RANGE SC SCX GET W (Student.Sname, Course.Cname): ヨSCX (SCX.Grade≥90 ∧ SCX.Sno=Student.Sno ∧ Course.Cno=SCX.Cno)
|
|
(8)用全稱(chēng)量詞的檢索
|
|
舉例
|
|
例12 查詢(xún)不選1號(hào)課程的學(xué)生名字 RANGE SC SCX GET W (Student.Sname): ∨ SCX (SCX.Sno≠Student.Sno ∨ SCX.Cno≠‘1‘) 本例實(shí)際上也可以用存在量詞來(lái)表示: RANGE SC SCX GET W (Student.Sname):フヨSCX (SCX.Sno=Student.Sno ∧ SCX.Cno=‘1‘)
|
|
(9)用兩種量詞的檢索
|
|
舉例
|
|
例13 查詢(xún)選修了全部課程的學(xué)生姓名 RANGE Course CX SC SCX GET W (Student.Sname): ∨CXヨSCX (SCX.Sno=Student.Sno ∧ SCX.Cno=CX.Cno)
|
|
(10)用蘊(yùn)函(Implication)的檢索
|
|
舉例
|
|
例14 查詢(xún)最少選修了95002學(xué)生所選課程的學(xué)生學(xué)號(hào) 本例題的求解思路是,對(duì)Course中的所有課程,依次檢查每一門(mén)課程,看95002是否選修了該課程,如果選修了,則再看某一個(gè)學(xué)生是否也選修了該門(mén)課。如果對(duì)于95002所選的每門(mén)課程該學(xué)生都選修了,則該學(xué)生為滿(mǎn)足要求的學(xué)生。把所有這樣的學(xué)生全都找出來(lái)即完成了本題。 RANGE Couse CX SC SCX SC SCY GET W (Student.Sno):∨CX(ヨSCX (SCX.Sno=‘95002‘ ∧ SCX.Cno=CX.Cno) => ヨSCY (SCY.Sno=Student.Sno ∧ SCY.Cno=CX.Cno))
|
|
(11)集函數(shù)
|
|
舉例
|
|
用戶(hù)在使用查詢(xún)語(yǔ)言時(shí),經(jīng)常要作一些簡(jiǎn)單的計(jì)算,例如要求符合某一查詢(xún)要求的元組數(shù),求某個(gè)關(guān)系中所有元組在某屬性上的值的總和或平均值等。為了方便用戶(hù),關(guān)系數(shù)據(jù)語(yǔ)言中建立了有關(guān)這類(lèi)運(yùn)算的標(biāo)準(zhǔn)函數(shù)庫(kù)供用戶(hù)選用。這類(lèi)函數(shù)通常稱(chēng)為集函數(shù)(Aggregation function)或內(nèi)部函數(shù)(Build-in function)。關(guān)系演算中提供了COUNT,TOTAL,MAX,MIN,AVG等集函數(shù),其含義如表2-5所示。
表2-5 關(guān)系演算中的集函數(shù)
|
函 數(shù) 名
|
功 能
|
COUNT
|
對(duì)元組計(jì)數(shù)
|
TOTAL
|
求總和
|
MAX
|
求最大值
|
MIN
|
求最小值
|
AVG
|
求平均值
|
例15 查詢(xún)學(xué)生所在系的數(shù)目 GET W (COUNT(Student.Sdept)) COUNT函數(shù)在計(jì)數(shù)時(shí)會(huì)自動(dòng)排除重復(fù)的Sdept值。 例16 查詢(xún)信息系學(xué)生的平均年齡 GET W (AVG(Student.Sage): Student.Sdept=‘IS‘)
|
2、
|
更新操作
|
|
(1) 修改操作 修改操作用UPDATE語(yǔ)句實(shí)現(xiàn)。其步驟是: ·首先用HOLD語(yǔ)句將要修改的元組從數(shù)據(jù)庫(kù)中讀到工作空間中 ·然后用宿主語(yǔ)言修改工作空間中元組的屬性 ·最后用UPDATE語(yǔ)句將修改后的元組送回?cái)?shù)據(jù)庫(kù)中
|
|
詳細(xì)信息…
|
|
需要注意的是,單純檢索數(shù)據(jù)使用GET語(yǔ)句即可,但為修改數(shù)據(jù)而讀元組時(shí)必須使用HOLD語(yǔ)句,HOLD語(yǔ)句是帶上并發(fā)控制的GET語(yǔ)句。有關(guān)并發(fā)控制的概念我們將在第五章中詳細(xì)介紹。 例17 95007學(xué)生從計(jì)算機(jī)科學(xué)系轉(zhuǎn)到信息系 HOLD W (Student.Sno, Student.Sdetp): Student.Sno=‘95007‘ (從Student關(guān)系中讀出95007學(xué)生的數(shù)據(jù)) MOVE ‘IS‘ TO W.Sdept (用宿主語(yǔ)言進(jìn)行修改) UPDATE W ?。ò研薷暮蟮脑M送回Student關(guān)系) 在該例中我們用HOLD語(yǔ)句來(lái)讀95007的數(shù)據(jù),而不是用GET語(yǔ)句。 如果修改操作涉及到兩個(gè)關(guān)系的話(huà),就要執(zhí)行兩次HOLD-MOVE-UPDATE操作序列。 修改主碼的操作是不允許的,例如不能用UPDATE語(yǔ)句將學(xué)號(hào)95001改為95102。如果需要修改關(guān)系中某個(gè)元組的主碼值,只能先用刪除操作刪除該元組,然后再把具有新主碼值的元組插入到關(guān)系中。
|
|
(2) 插入操作
|
|
插入操作用PUT語(yǔ)句實(shí)現(xiàn)。其步驟是: ·首先用宿主語(yǔ)言在工作空間中建立新元組 ·然后用PUT語(yǔ)句把該元組存入指定的關(guān)系中
|
|
舉例
|
|
例18 學(xué)校新開(kāi)設(shè)了一門(mén)2學(xué)分的課程“計(jì)算機(jī)組織與結(jié)構(gòu)”,其課程號(hào)為8,直接先行課為6號(hào)課程。插入該課程元組。 MOVE ‘8‘ TO W.Cno MOVE ‘計(jì)算機(jī)組織與結(jié)構(gòu)‘ TO W.Cname MOVE ‘6‘ TO W.Cpno MOVE ‘2‘ TO W.Ccredit PUT W (Course) (把W中的元組插入指定關(guān)系Course中) PUT語(yǔ)句只對(duì)一個(gè)關(guān)系操作,也就是說(shuō)表達(dá)式必須為單個(gè)關(guān)系名。如果插入操作涉及多個(gè)關(guān)系,必須執(zhí)行多次PUT操作。
|
|
(3) 刪除
|
|
刪除操作用DELETE語(yǔ)句實(shí)現(xiàn)。其步驟為: ·用HOLD語(yǔ)句把要?jiǎng)h除的元組從數(shù)據(jù)庫(kù)中讀到工作空間中 ·用DELETE語(yǔ)句刪除該元組
|
|
舉例
|
|
例19 95110學(xué)生因故退學(xué),刪除該學(xué)生元組 HOLD W (Student): Student.Sno=‘95110‘ DELETE W 例20 將學(xué)號(hào)95001改為95102 HOLD W (Student): Student.Sno=‘95001‘ DELETE W MOVE ‘95102‘ TO W.Sno MOVE ‘李勇‘ TO W.Sname MOVE ‘男‘ TO W.Ssex MOVE ‘20‘ TO W.Sage MOVE ‘CS‘ TO W.Sdept PUT W (Student) 例21 刪除全部學(xué)生 HOLD W (Student) DELETE W 由于SC關(guān)系與Student關(guān)系之間的具有參照關(guān)系,為保證參照完整性,刪除Student關(guān)系中全部元組的操作將導(dǎo)致DBMS自動(dòng)執(zhí)行刪除SC關(guān)系中全部元組的操作: HOLD W (SC) DELETE W
|