譚毓銀,李懷成,繆為民
(海南大學計算機與網(wǎng)絡空間安全學院,海口570228)
《數(shù)據(jù)庫系統(tǒng)概論》[1]是我校信息類的專業(yè)必修課,其教學目標是向學生介紹數(shù)據(jù)庫系統(tǒng)的基本概念及其構成,使學生掌握基本的關系數(shù)據(jù)庫理論和典型關系數(shù)據(jù)語言SQL的編程。而關系代數(shù)運算及SQL語句用法是本課的重點和難點,SQL語句在實際的數(shù)據(jù)庫開發(fā)運用中較靈活,其理論基礎離不開對關系代數(shù)運算的理解[2-4]。
通過多年的教學,發(fā)現(xiàn)本課程涉及大量的理論講解,教學基本采用教材所給的案例,每章節(jié)所舉例題不盡相同,往往是東一個西一個,沒有緊密的連貫性,缺乏統(tǒng)一的教學項目和案例設計,教學效果并不是很好,造成學員學習目的不明確,成就感不強,消極對待數(shù)據(jù)庫原理知識和SQL語言的學習[5-7]。
在實驗教學過程中,先以學生接觸較多的學生選修課程模型為依托,合理設計教學案例,輔以圖示分解教學,幫助學生掌握關系代數(shù)的運算,再講解SQL語句基本用法,最后通過在實驗中用SQL語句來實現(xiàn)關系代數(shù)運算,從而加深學生對SQL語句用法和關系代數(shù)運算的理解,為數(shù)據(jù)庫查詢打下堅實的基礎。
關系代數(shù)是一種抽象的查詢語言,它用對關系的運算來表達查詢,是處理關系數(shù)據(jù)庫的重要數(shù)學基礎,是關系數(shù)據(jù)操縱語言的一種傳統(tǒng)表達方式。
關系代數(shù)運算按運算符的不同可分為傳統(tǒng)的集合運算和專門的關系運算兩類。傳統(tǒng)的集合運算是二目運算,包括并、差、交、笛卡爾積4種運算;專門的關系運算包括選擇、投影、連接、除運算等[1]。
設有學生關系Stud、學生關系Other、課程關系Course和選修關系StudCous,如表1-表4所示。下面的關系代數(shù)運算將對這四個關系進行運算。

表1 Stud關系

表2 Other關系

表3 Stud關系

表4 StudCous關系
設關系R和關系S具有相同的目n(即兩個關系都有n個屬性),且相應的屬性取自同一個域,t是元組變量,t∈R表示t是R的一個元組。
(1)并運算:將R與S合并,并且去掉重復元組后所構成的一個關系。

例1:將Stud與Other合并成SU關系,關系代數(shù)運算表達式為:

關系運算的結果如表5所示。因為Other關系中的“714002”“714004”所對應的元組已經(jīng)存在于Stud關系中,所以合并后的關系只保留了一份。

表5 并運算后的SU關系

表6 交運算后的SN關系
(2)交運算:由既屬于R又屬于S的元組組成的新關系。

例2:將Stud與Other相交成SN關系,關系代數(shù)運算表達式為:

關系運算的結果如表6所示。因為Stud及Other關系中都有“714002”“714004”所對應的元組,所以相交后的關系只是由共同存在于這兩個關系的元組所組成的新關系。
(3)差運算:由屬于R而不屬于S的所有元組組成,即在R中去掉R與S相同的元組。

例3:將Stud與Other進行差運算,關系代數(shù)運算表達式為:

關系運算的結果如表7所示。因為Stud及Other關系中都有“714002”“714004”所對應的元組,所以差運算就是在Stud關系中去掉這兩個相同元組后所組成的新關系。

表7 差運算后的SM關系
(4)笛卡爾積
這里的笛卡爾積嚴格地講應該是廣義的笛卡爾積。設有n元關系R及m元關系S,它們分別有p、q個元組,則關系R與S經(jīng)笛卡爾積記為R×S,該關系是一個n+m元關系,元組個數(shù)是p×q,由R與S的有序組組合而成。即用R中的每個元組分別與S中的所有元組相結合組成一個新的關系。新的關系的屬性個數(shù)為R與S屬性個數(shù)之和,元組個數(shù)為R與S元組個數(shù)相乘積。

例4:將Stud與StudCous進行笛卡爾積運算,關系代數(shù)運算表達式為:

關系運算的結果如表8所示。
從表8中,可以看出,笛卡爾積實際上用左邊關系的每一行分別與右邊關系的所有行進行相乘(或相合并)。注意:笛卡爾積的全集在應用中是沒有意義的。這里列出全集只是表示全部可能的組合而已,并不代表實際上有這么多可行的組合。笛卡爾積運算是為后面的連接、自然連接等做準備。

表8 笛卡爾積后的SCP關系
(1)選擇:它是由關系R中滿足邏輯條件的元組所組成的新的關系,記作:

邏輯條件F表示選擇條件,它是一個邏輯表達式,取邏輯值“true”或“false”。
例5:查詢關系Stud中Dept為“計算機科學”的信息。

結果如表9所示。Stud關系原來有5個元組,而執(zhí)行邏輯條件Dept=“計算機科學”運算后,只有2個元組滿足條件。講到這里,大家發(fā)現(xiàn),選擇運算是對關系進行元組(行)的選取,當然,如果有重復的行,還需要刪除重復行后形成新的關系。

表9 選擇運算后的關系
(2)投影:它是從R中選取出若干屬性列,去掉重復的元組所組成新的關系,記作:

例6:查詢關系Stud中Dept的信息。
關系代數(shù)運算式為:∏Dept( S tud)
結果如表10所示。R關系原來有5個元組,而投影結果消除了重復的部分元組,因此只有3個元組。講到這里,大家發(fā)現(xiàn),投影不僅取消了原關系中的某些列,而且還可能消去了某些元組,因為取消了某些屬性列后,就可能出現(xiàn)重復行,就取消這些完全相同的行。所以投影是能夠把一個關系的屬性域變小的運算。

表10 投影運算后的關系
所以,有了投影、選擇運算,我們就可以方便地找到一個關系內的任意行、列的數(shù)據(jù)。
(3)連接:它是從關系R和關系S的笛卡爾積中選取屬性間滿足一定條件的元組。記作:

其中,A和B分別為R和S上列數(shù)相等且可比的屬性組,θ是比較運算符。因此,連接也稱為θ連接。當θ為“=”時的連接運算稱為等值連接,可以記為:

例7:查詢每個學生及其選修課程的情況。關系Stud與關系StudCous進行Sno=S sn o的等值連接。關系代數(shù)運算式為:SW=StudSno=Ssno StudCous
結果如表11所示。該關系實際上是在表8關系中進行邏輯條件為“Sno=S sn o”的選擇運算后得到的新關系,該運算大大減少了元組的個數(shù)。但是請大家注意Sno和S sn o屬性對應的值是一樣的。假如我們把S sno屬性名改為Sno,就將會變成自然連接。

表11 等值連接后的SW關系
(4)自然連接:自然連接是一種特殊的等值連接。它要求:①兩個關系要有公共的屬性域;②通過公共域的相等值進行連接。記作:

例8:假設我們將關系StudCous中的S sn o屬性改名為Sno,把關系Stud與改名后的關系StudCous進行自然連接。
關系代數(shù)運算式為:SP=Stud?StudCous
結果如表12所示。該關系和表11的關系很類似,只是少了Sno(S sn o已經(jīng)更名為Sno)的同名屬性列。即自然連接是在等值連接的基礎上,消除兩個關系的公共屬性域的連接。

表12 自然連接后的SP關系
一般的連接操作是從行的角度進行運算,但自然連接還需要取消重復列,所以是同時從行和列的角度進行運算。
(5)除運算
設關系R除以關系S的結果為T,則T包含所有在R但不在S中的屬性及其值,且T的元組與S的元組的所有組合都在R中。記作:

這個定義是教材給出的。在這幾種運算中,除法運算復雜、抽象,是教學環(huán)節(jié)中的難點問題,學生理解起來比較困難[8]。如何來講解除法運算呢?
我們先對StudCous關系的S sn o和Cno屬性做投影操作,即:SCNO=∏Ssno,Ccno(StudCous),得到的關系SCNO如表13所示。再對Course關系的Cno屬性做投影操作,即:CNO=∏Cno(Course),得到的關系CNO如表14所示。那么SCNO÷CNO得到的關系SSNO如表15所示。這實際上就是:

表13 SCNO關系

表14 CNO關系

表15 SSNO關系
例9:查詢選修了所有課程的學生姓名。
SQL(Structured Query Language)是關系數(shù)據(jù)庫的標準語言,也是一個通用的、功能極強的關系數(shù)據(jù)庫語言。其主要特點包括:綜合統(tǒng)一、高度非過程化、面向集合的操作方式、以同一種語法結構提供多種使用方式、語言簡潔、易學易用等。
數(shù)據(jù)查詢是數(shù)據(jù)庫的核心操作。SQL提供了SELECT語句進行數(shù)據(jù)查詢,該語句具有靈活的使用方式和豐富的功能[10]。其一般格式為:

基本的工作原理:FROM子句先被執(zhí)行,通過FROM子句獲得一個虛擬表,然后通過WHERE子句從虛擬表中獲取滿足條件的記錄,生成新的虛擬表。將新虛擬表中的記錄通過GROUP BY子句分組后得到更新的虛擬表,而后HAVING子句在最新的虛擬表中篩選出滿足條件的記錄組成另外一個虛擬表中,SELECT子句會將指定的列提取出來組成更新的虛擬表,最后ORDER BY子句對其進行排序得出最終的虛擬表。通常這個最終的虛擬表被稱為查詢結果集[11]。
每種關系運算在SQL中都有對應的實現(xiàn),Union、Intersect、Except分別對應集合運算中的并、交、差運算,但在SQL Server中不支持Intersect、Except運算符的使用。本實驗通過在SQL Server 2008環(huán)境下實現(xiàn)關系代數(shù)的各種運算(例1-例9),使學生在感性上進一步認識關系代數(shù)在數(shù)據(jù)庫中的應用,從而更深刻地理解了關系代數(shù)運算和更熟練地掌握了SQL語句的用法[12]。
例1中并運算的SQL語句
Select*from Stud Union Select*from Other
例2中交運算的SQL語句
Select Stud.*from Stud,Other Where Other.Sno=Stud.Sno)
例3中差運算的SQL語句
Select*from Stud Where Sno not in(Select Sno from Other)
例4中笛卡爾積運算的SQL語句
Select*from Stud,StudCous
例5中選擇運算的SQL語句
Select*from Stud Where Dept=^'計算機科學'例6中投影運算的SQL語句
Select Distinct Dept from Stud
例7中等值連接運算的SQL語句
Select*from Stud,StudCous Where Stud.Sno=Stud?Cous.Ssno
例8中自然連接運算的SQL語句
Select*from Stud,StudCous Where Stud.Sno=Stud?Cous.Sno
例9的SQL語句,除運算
Select Sname From Stud Where not exists
(Select*From Course Where not exists
(Select*From StudCous Where Stud.Sno=StudCous.Ssno
And Course.Cno=StudCous.Ccno
)
)
注意,在做連接查詢時,至少涉及兩個以上的表,用到的關系運算為笛卡爾積或連接或自然連接。但它們都是在笛卡爾積的基礎上所進行的操作。
最后,我們利用教材中的一個例子,引導學生思考查詢優(yōu)化的步驟,激發(fā)學生對查詢優(yōu)化的興趣。
例3.51查詢選修了95203的課程且成績在80分以上的所有學生的學號和姓名。
Select Stud.Sno,Stud.Sname From Stud,StudCous
Where Stud.Sno=StudCous.Ssno and StudCous.Score>=80
對應的關系代數(shù)運算表達式為:

從這個表達式中,先是關系Stud與StudCous做笛卡爾積運算,然后再選取滿足邏輯條件為σCcno=95203∧Score≥80的元組組成一個虛擬表關系,再對該關系的Sno,Sname列進行投影運算,如果有重復行,去掉重復行后組成查詢結果集。在課堂講解上,就用表8笛卡爾積運算的結果來演示,讓學生知道會產生大量的元組及屬性,然后引出優(yōu)化的問題。

該查詢優(yōu)化的思想是先從StudCous中選取出σCcno=95203∧Score≥80的元組形成一個虛擬表關系,再和Stud中滿足連接條件的元組進行連接得到最終的結果關系。
由此,一步步引導學生進行查詢優(yōu)化的提出,在加強學生關系代數(shù)的學習的同時,也為后續(xù)學生學習SQL查詢優(yōu)化指引了一個方向。
關系代數(shù)運算是數(shù)據(jù)庫原理課中較為抽象的內容,是SQL查詢的理論基礎。如果以純理論教學為主,學生不能真正理解關系代數(shù)運算,也就不可能寫出優(yōu)異的SQL語句。這就要求教師在設計教學案例時,能夠縱覽全局,設計前后統(tǒng)一、連貫性強的教學項目案例,將能幫助學生快速理解該知識點乃至該門課程起到至關重要的作用,同時也能提高學生的實驗動手能力。由于該課程在近幾年中一直是我校的教學示范課程,2018年3月該課程成為“第二批海南省高校精品在線開放課程立項建設課程”。