關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)_第1頁(yè)
關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)_第2頁(yè)
關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)_第3頁(yè)
關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)_第4頁(yè)
關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩225頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第7章 關(guān)系數(shù)據(jù)庫(kù)系統(tǒng) 7.1 關(guān)系模型概述 7.2 關(guān)系數(shù)據(jù)結(jié)構(gòu)及形式化定義 7.2.1 關(guān)系的形式化定義7.2.2 關(guān)系的性質(zhì)7.3 關(guān)系的完整性 7.3.1 完整性約束的分類7.3.2 實(shí)體完整性規(guī)則7.3.3 參照完整性規(guī)則7.3.4 用戶定義的完整性7.4 關(guān)系代數(shù) 7.4.1 傳統(tǒng)的集合運(yùn)算7.4.2 專門的關(guān)系運(yùn)算7.5 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL 7.5.1 SQL概述7.5.2 SQL的數(shù)據(jù)定義7.5.3 SQL的數(shù)據(jù)查詢7.5.4 SQL的數(shù)據(jù)更新7.5.5 視圖7.5.6 SQL的數(shù)據(jù)控制語(yǔ)句 7.1 關(guān)系模型概述 關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)是支持關(guān)系模型的數(shù)據(jù)庫(kù)系統(tǒng)。 關(guān)系模型由關(guān)系

2、數(shù)據(jù)結(jié)構(gòu)、關(guān)系操作集合和關(guān)系完整性約束3部分組成。 1關(guān)系數(shù)據(jù)結(jié)構(gòu) 關(guān)系模型的數(shù)據(jù)結(jié)構(gòu)非常單一,只有關(guān)系。在關(guān)系模型中,現(xiàn)實(shí)世界的實(shí)體以及實(shí)體間的各種聯(lián)系均用關(guān)系來(lái)表示。在用戶看來(lái),關(guān)系模型中數(shù)據(jù)的邏輯結(jié)構(gòu)是一張二維表。 2關(guān)系操作 關(guān)系模型中常用的關(guān)系操作包括:選擇、投影、連接、除、并、交、差等查詢操作,以及增、刪、改等更新操作兩大部分。查詢的表達(dá)能力是其中最主要的部分。 關(guān)系操作的特點(diǎn)是集合操作方式,即操作的對(duì)象和結(jié)果都是集合。這種操作方式也稱為一次一集合(set-at-a-time)的方式。相應(yīng)地,非關(guān)系數(shù)據(jù)模型的數(shù)據(jù)操作方式則為一次一記錄(record-at-a-time)的方式。 早

3、期的關(guān)系操作能力通常用代數(shù)方法和邏輯方法來(lái)表示,分別稱為關(guān)系代數(shù)和關(guān)系演算。關(guān)系代數(shù)是用對(duì)關(guān)系的運(yùn)算來(lái)表達(dá)查詢要求的方式;關(guān)系演算是用謂詞來(lái)表達(dá)查詢要求的方式。關(guān)系演算又可按謂詞變?cè)幕緦?duì)象是元組變量還是域變量分為元組關(guān)系演算和域關(guān)系演算。關(guān)系代數(shù)、元組關(guān)系演算和域關(guān)系演算這三種語(yǔ)言在表達(dá)能力上是完全等價(jià)的。稍后只對(duì)關(guān)系代數(shù)進(jìn)行闡述。 關(guān)系模型給出了關(guān)系操作的能力和特點(diǎn),關(guān)系操作通過(guò)關(guān)系語(yǔ)言實(shí)現(xiàn)。關(guān)系語(yǔ)言是一種高度非過(guò)程化的語(yǔ)言,用戶不必請(qǐng)求DBA為其建立特殊的存取路徑,也不必求助于循環(huán)結(jié)構(gòu)就可以完成數(shù)據(jù)操作。 SQL(Structured Query Language)是一種介于關(guān)系代數(shù)和

4、關(guān)系演算之間的語(yǔ)言。SQL不僅具有豐富的查詢功能,而且具有數(shù)據(jù)定義和數(shù)據(jù)控制功能,是集查詢、DDL、DML和DCL于一體的關(guān)系數(shù)據(jù)語(yǔ)言。它充分體現(xiàn)了關(guān)系數(shù)據(jù)語(yǔ)言的特點(diǎn)和優(yōu)點(diǎn),是關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言。因此,關(guān)系數(shù)據(jù)語(yǔ)言可以分為三類: 關(guān)系代數(shù)語(yǔ)言,例如ISBL元組關(guān)系演算語(yǔ)言,例如ALPHA、QUEL關(guān)系數(shù)據(jù)語(yǔ)言 關(guān)系演算語(yǔ)言域關(guān)系演算語(yǔ)言,例如QBE 具有關(guān)系代數(shù)和關(guān)系演算雙重特點(diǎn)的語(yǔ)言,例如SQL 這些關(guān)系數(shù)據(jù)語(yǔ)言的共同特點(diǎn)是:語(yǔ)言具有完備的表達(dá)能力,是非過(guò)程化的集合操作語(yǔ)言,功能強(qiáng),能夠嵌入高級(jí)語(yǔ)言中使用。 3關(guān)系的完整性約束 數(shù)據(jù)庫(kù)的數(shù)據(jù)完整性是指數(shù)據(jù)庫(kù)中數(shù)據(jù)的正確性和相容性。例如,學(xué)生

5、的學(xué)號(hào)必須惟一,性別只能是男或女,學(xué)生所在的系必須是學(xué)校已開(kāi)設(shè)的系,等等??梢?jiàn),數(shù)據(jù)庫(kù)中數(shù)據(jù)是否具有完整性關(guān)系到數(shù)據(jù)庫(kù)系統(tǒng)能否真實(shí)地反映現(xiàn)實(shí)世界,因此,數(shù)據(jù)庫(kù)的數(shù)據(jù)完整性是十分重要的。 數(shù)據(jù)完整性由完整性規(guī)則來(lái)定義,關(guān)系模型的完整性規(guī)則是對(duì)關(guān)系的某種約束條件。關(guān)系模型中有三類完整性約束:實(shí)體完整性、參照完整性和用戶定義的完整性。其中實(shí)體完整性和參照完整性是關(guān)系模型必須滿足的完整性約束條件,應(yīng)該由關(guān)系系統(tǒng)自動(dòng)支持;而用戶定義的完整性是應(yīng)用領(lǐng)域需要遵循的約束條件,體現(xiàn)了具體領(lǐng)域中的語(yǔ)義約束。 完整性約束由DBMS提供定義手段,并由DBMS的完整性檢查機(jī)制負(fù)責(zé)檢查。 7.2 關(guān)系數(shù)據(jù)結(jié)構(gòu)及形式化定義

6、 在關(guān)系模型中,無(wú)論是實(shí)體還是實(shí)體之間的聯(lián)系均用單一的結(jié)構(gòu)類型即關(guān)系來(lái)表示。前面已經(jīng)非形式化地介紹了關(guān)系模型及有關(guān)的基本概念。關(guān)系模型是建立在集合代數(shù)的基礎(chǔ)上的,這里從集合論角度對(duì)關(guān)系數(shù)據(jù)結(jié)構(gòu)進(jìn)行較為嚴(yán)格的定義和描述。 7.2.1 關(guān)系的形式化定義 1域(Domain) 域是一組具有相同數(shù)據(jù)類型的值的集合。例如: D1=姓名集合(NAME)= 丁中,王芳,李兵 D2=性別集合(SEX)= 男,女 D3=年齡集合(AGE)= 17,18,19 以上共給出了三個(gè)域,其中D1,D3各有3個(gè)值,稱它們的基數(shù)(Cardinal Number)為3;D2只含2個(gè)值,故其基數(shù)為2。 2笛卡爾乘積(Carte

7、sian Product) 按照集合論的觀點(diǎn),上述三個(gè)域D1,D2,D3的笛卡爾乘積可以表示為: D1D2D3 = (丁中,男,17),(丁中,男,18), (丁中,男,19),(丁中,女,17), (丁中,女,18),(丁中,女,19), (王芳,男,17),(王芳,男,18), (王芳,男,19),(王芳,女,17), (王芳,女,18),(王芳,女,19), (李兵,男,17),(李兵,男,18), (李兵,男,19),(李兵,女,17), (李兵,女,18),(李兵,女,19) 由此可見(jiàn),笛卡爾乘積也是一個(gè)集合。它的每一個(gè)元素都用圓括號(hào)括起,稱之為元組。本例中的笛卡爾乘積共有18個(gè)元組

8、,或者說(shuō)這個(gè)乘積的基數(shù)為18。顯然,笛卡爾乘積的基數(shù)等于構(gòu)成這個(gè)笛卡爾乘積的所有域的基數(shù)的累乘乘積,即 m = (本例中m = 323) 其中:m笛卡爾乘積的基數(shù) mi第i個(gè)域的基數(shù) n域的個(gè)數(shù) 使用集合論的符號(hào),笛卡爾乘積可定義為: 定義7-1 給定一組域D1,D2,Dn,這些域中可以有相同的。D1,D2,Dn的笛卡爾乘積為:D1D2Dn = (d1,d2,dn)|diDi,i=1,2, ,n 可以讀作:該笛卡爾乘積的集合由形如(d1,d2,dn)的元素組成,元素中的di分別屬于第i個(gè)域Di。 笛卡爾乘積中的每一個(gè)元素(d1,d2,dn)叫做一個(gè)n元組(n-tuple),簡(jiǎn)稱元組(Tuple

9、),di為元組中的第i個(gè)分量(Component)。n=1的元組稱為單元組,n=2的元組為二元組,依此類推。 注意:n元組(d1,d2,dn)中各個(gè)分量的位置不 能任意顛倒,因?yàn)閐iDi。 有時(shí),構(gòu)成笛卡爾乘積的域可能是無(wú)限集(如某區(qū)間的所有實(shí)數(shù)),這時(shí)笛卡爾乘積也是無(wú)限集。 笛卡爾乘積可表示為一個(gè)二維表。表中的每行對(duì)應(yīng)一個(gè)元組,表中的每列對(duì)應(yīng)一個(gè)域。 表7-1中給出了D1,D2,D3三個(gè)域的笛卡爾乘積。表7-1 D1,D2,D3的笛卡爾乘積NAMESEXAGE丁中丁中丁中丁中丁中丁中王芳王芳王芳王芳王芳王芳李兵李兵李兵李兵李兵李兵男男男女女女男男男女女女男男男女女女1718191718191

10、71819171819171819171819 3關(guān)系(Relation) 在笛卡爾乘積中取出一個(gè)子集,可以構(gòu)成關(guān)系。 定義7-2 笛卡爾乘積D1D2Dn的有限子集稱為域D1,D2,Dn上的n元關(guān)系,簡(jiǎn)稱關(guān)系。通常表示為: R(D1,D2,Dn) 這里R表示關(guān)系的名字,n是關(guān)系的目或度(Degree)。 關(guān)系是笛卡爾乘積的有限子集,所以關(guān)系也是一個(gè)二維表,表的每行對(duì)應(yīng)一個(gè)元組,表的每列對(duì)應(yīng)一個(gè)域。由于域可以相同,為了加以區(qū)分,必須給表的每一列起一個(gè)名字,稱為屬性,則n元關(guān)系有n個(gè)屬性。n=1的關(guān)系只含有一個(gè)屬性,稱為單元關(guān)系,n=2為二元關(guān)系,依此類推。 在同一個(gè)關(guān)系中,屬性名應(yīng)該是惟一的。屬

11、性的取值范圍Di(i=1,2, ,n)稱為值域。 若關(guān)系中的某一屬性組的值能惟一地標(biāo)識(shí)一個(gè)元組,則稱該屬性組為候選碼(Candidate Key)。若一個(gè)關(guān)系中有多個(gè)候選碼,則選定其中一個(gè)為主碼(Primary Key)。候選碼中的諸屬性稱為主屬性(Prime Attribute)。不包含在任何候選碼中的屬性稱為非主屬性(Non-key Attribute)。在最簡(jiǎn)單的情況下,候選碼只包含一個(gè)屬性;在最極端的情況下,關(guān)系模式的所有屬性組是這個(gè)關(guān)系模式的候選碼,稱為全碼(All-key)。 例如,可以在表7-1的笛卡爾乘積中取出一個(gè)子集來(lái)構(gòu)造一個(gè)關(guān)系。由于一個(gè)學(xué)生的性別和年齡只能分別取一個(gè)值,所

12、以笛卡爾乘積中的許多元組是無(wú)實(shí)際意義的,從中取出有實(shí)際意義的元組來(lái)構(gòu)造關(guān)系。該關(guān)系的名字為STUDENT,屬性名就取域名,即NAME,SEX,AGE。則這個(gè)關(guān)系可以表示為:STUDENT(NAME,SEX,AGE)用二維表表示,關(guān)系STUDENT的內(nèi)容如表7-2所示。表7-2 STUDENT(學(xué)生)關(guān)系 NAME SEX AGE 丁中 王芳 李兵 男 女 男 19 17 18 4關(guān)系模型(Relation Model) 在數(shù)據(jù)庫(kù)中要區(qū)分型和值。在關(guān)系數(shù)據(jù)庫(kù)中,關(guān)系模式是型,關(guān)系是值。關(guān)系模式是對(duì)關(guān)系的描述,通常它要描述一個(gè)關(guān)系由哪些屬性組成,這些屬性來(lái)自哪些域,以及屬性與域之間的映象關(guān)系,另外

13、還要描述關(guān)系中元組的語(yǔ)義。因此,一個(gè)關(guān)系模式應(yīng)當(dāng)是一個(gè)5元組。 定義7-3 關(guān)系的描述稱為關(guān)系模式(Relation Schema)。它可以形式化地表示為: R(U,D,dom,F(xiàn)) 其中,R為關(guān)系名,U為組成該關(guān)系的屬性名集合,D為屬性組U中屬性所來(lái)自的域,dom為屬性向域的映象集合,F(xiàn)為屬性間數(shù)據(jù)的依賴關(guān)系集合。 通常關(guān)系模式可以簡(jiǎn)記為: R(U) 或R(A1,A2,An) 其中R為關(guān)系名,A1,A2,An為屬性名。而域名及屬性向域的映象常常直接說(shuō)明為屬性的類型、長(zhǎng)度。 關(guān)系模式有時(shí)也稱為關(guān)系框架。 定義7-4 關(guān)系模型是在某數(shù)據(jù)處理工作中的所有關(guān)系模式及其關(guān)鍵字的匯集。 例7-1 某大學(xué)

14、采用計(jì)算機(jī)來(lái)管理其教學(xué)工作。在教學(xué)中涉及三個(gè)實(shí)體:教師,課程和學(xué)生。同時(shí)教師和課程,課程和學(xué)生之間都有聯(lián)系。因此可以確定該大學(xué)教學(xué)工作的關(guān)系模型由以下幾個(gè)關(guān)系模式和關(guān)鍵字構(gòu)成。關(guān)系模式:teachers(工作證號(hào),單位,姓名,職稱)student(學(xué)號(hào),班級(jí),姓名)subjects(課程號(hào),課程名,學(xué)分)t-s(工作證號(hào),課程號(hào),教室)s-s(學(xué)號(hào),課程號(hào),成績(jī))關(guān)鍵字:teachers中的“工作證號(hào)”student中的“學(xué)號(hào)”subjects中的“課程號(hào)”t-s中的“工作證號(hào)”和“課程號(hào)”s-s中的“學(xué)號(hào)”和“課程號(hào)” 5關(guān)系數(shù)據(jù)庫(kù) 在關(guān)系模型中,實(shí)體以及實(shí)體間的聯(lián)系都是用關(guān)系來(lái)表示的。在一

15、個(gè)給定的應(yīng)用領(lǐng)域中,所有實(shí)體及實(shí)體之間聯(lián)系的集合構(gòu)成一個(gè)關(guān)系數(shù)據(jù)庫(kù)。 關(guān)系數(shù)據(jù)庫(kù)也有型和值之分。關(guān)系數(shù)據(jù)庫(kù)的型稱為關(guān)系數(shù)據(jù)庫(kù)模式,是對(duì)關(guān)系數(shù)據(jù)庫(kù)的描述,它包括若干域的定義以及在這些域上定義的若干關(guān)系模式。關(guān)系數(shù)據(jù)庫(kù)的值是這些關(guān)系模式在某一時(shí)刻對(duì)應(yīng)的關(guān)系的集合,通常就稱為關(guān)系數(shù)據(jù)庫(kù)。 7.2.2 關(guān)系的性質(zhì)關(guān)系數(shù)據(jù)庫(kù)中的關(guān)系具有下列一些性質(zhì): (1) 任意兩個(gè)元組(兩行)不能完全相同。 (2) 關(guān)系中元組(行)的次序是不重要的,即行的次序可以任意交換。 例如,把表7-2中丁中和王芳兩行位置對(duì)調(diào),對(duì)關(guān)系的內(nèi)容并無(wú)影響。 (3) 關(guān)系中屬性(列)的次序也是不重要的,即列的次序可以任意交換。 例如,把

16、表7-2中SEX移到第三列,AGE移到第二列,也是允許的。 (4) 同一列中分量必須來(lái)自同一個(gè)域,是同一類型的數(shù)據(jù)。 例如,表7-2中的第二列只能從域D2(SEX)中取值,非“男”即“女”,不能取另外的值。 (5) 屬性必須有不同的名稱,但不同的屬性可出自相同的域,即它們的分量可以取值于同一個(gè)域。 例如,在表7-3中,職業(yè)與兼職是兩個(gè)不同的屬性,但它們都取自同一個(gè)域集合 (職業(yè)=教師,工人,輔導(dǎo)員)。表7-3 職 工 關(guān) 系姓 名職 業(yè)兼 職王飛朱梅丁沖教師工人工人輔導(dǎo)員教師輔導(dǎo)員 如果屬性也用相同的名稱,就無(wú)法分辨了。 (6) 每一分量必須是原子的,即是不可再分的數(shù)據(jù)項(xiàng)。 例如在表7-4中,

17、籍貫中含有省、縣兩項(xiàng),出現(xiàn)了“表中有表”的現(xiàn)象,這在關(guān)系數(shù)據(jù)庫(kù)中是不允許的。解決的辦法是把籍貫分成省、縣兩列,如表7-5所示。表7-4 表中有表 姓 名 籍 貫 省 縣 王飛 朱海 江蘇 蘇州 四川 成都 表7-5 規(guī)范化關(guān)系 姓 名 省 縣 王飛 朱海 江蘇 蘇州 四川 成都 滿足這一性質(zhì)的關(guān)系稱為規(guī)范化關(guān)系(Normalized Relation),在下一章將要詳細(xì)討論這部分內(nèi)容。7.3 關(guān)系的完整性 7.3.1 完整性約束的分類 數(shù)據(jù)完整性由完整性規(guī)則來(lái)定義,關(guān)系模型的完整性規(guī)則是對(duì)關(guān)系的某種約束條件。關(guān)系模型中有三類完整性約束:實(shí)體完整性、參照完整性和用戶定義的完整性。 為了維護(hù)數(shù)據(jù)庫(kù)

18、中數(shù)據(jù)的完整性,在對(duì)關(guān)系數(shù)據(jù)庫(kù)執(zhí)行插入、刪除和修改操作時(shí),必須遵循下述三類完整性規(guī)則: (1) 實(shí)體完整性規(guī)則:關(guān)系中的元組在主碼的屬性上不能有空值。 (2) 參照完整性規(guī)則:外碼的值不允許參照不存在的相應(yīng)表的主碼的值。 (3) 用戶定義的完整性規(guī)則:用戶根據(jù)具體應(yīng)用的語(yǔ)義要求,利用DBMS提供的定義和檢驗(yàn)這類完整性規(guī)則的機(jī)制,自己定義的完整性規(guī)則。例7-2 在學(xué)生選課管理數(shù)據(jù)庫(kù)中有如下4個(gè)關(guān)系:學(xué)生(學(xué)號(hào),姓名,性別,專業(yè)號(hào),年齡),主碼為“學(xué)號(hào)”課程(課程號(hào),課程名,學(xué)分),主碼為“課程號(hào)”選修(學(xué)號(hào),課程號(hào),成績(jī)),主碼為“學(xué)號(hào)”,“課程號(hào)”專業(yè)(專業(yè)號(hào),專業(yè)名),主碼為“專業(yè)號(hào)” 7.

19、3.2 實(shí)體完整性規(guī)則 實(shí)體完整性規(guī)則是對(duì)關(guān)系中主屬性值的約束。 規(guī)則7-1 實(shí)體完整性規(guī)則 若屬性A是關(guān)系R的主屬性,則屬性A不能取空值。 實(shí)體完整性規(guī)則規(guī)定關(guān)系的所有主屬性都不能取空值,而不僅是主碼整體不能取空值。例7-2中的關(guān)系:學(xué)生(學(xué)號(hào),姓名,性別,專業(yè)號(hào),年齡),主碼為“學(xué)號(hào)”,則“學(xué)號(hào)”不能取空值。在關(guān)系“選修(學(xué)號(hào),課程號(hào),成績(jī))”中,“學(xué)號(hào)、課程號(hào)”為主碼,則“學(xué)號(hào)”和“課程號(hào)”兩個(gè)屬性都不能取空值。 對(duì)于實(shí)體完整性規(guī)則說(shuō)明如下: (1) 實(shí)體完整性規(guī)則是針對(duì)關(guān)系而言的。一個(gè)關(guān)系通常對(duì)應(yīng)現(xiàn)實(shí)世界的一個(gè)實(shí)體集。例如,學(xué)生關(guān)系對(duì)應(yīng)于現(xiàn)實(shí)世界中學(xué)生的集合。 (2) 現(xiàn)實(shí)世界中的實(shí)體

20、是可區(qū)分的,即它們具有某種惟一性標(biāo)識(shí)。 (3) 相應(yīng)地,在關(guān)系模型中以主碼作為惟一性標(biāo)識(shí)。 (4) 主碼中的屬性即主屬性不能取空值。所謂空值就是“不知道”或“無(wú)意義”的值。如果主屬性取空值,說(shuō)明存在某個(gè)不可標(biāo)識(shí)的實(shí)體,即存在不可區(qū)分的實(shí)體,這與第(2)點(diǎn)相矛盾,因此這個(gè)規(guī)則稱為實(shí)體完整性規(guī)則。 7.3.3 參照完整性規(guī)則 現(xiàn)實(shí)世界中的實(shí)體之間往往存在某種聯(lián)系,在關(guān)系模型中實(shí)體及實(shí)體間的聯(lián)系都是用關(guān)系來(lái)描述的,這樣就自然存在著關(guān)系與關(guān)系間的參照(引用)。 例7-3 學(xué)生實(shí)體和專業(yè)實(shí)體可以用例7-2中的學(xué)生關(guān)系和專業(yè)關(guān)系表示,其中主碼用下劃線標(biāo)識(shí): 學(xué)生(學(xué)號(hào),姓名,性別,專業(yè)號(hào),年齡) 專業(yè)(專

21、業(yè)號(hào),專業(yè)名) 這兩個(gè)關(guān)系之間存在著屬性的參照,即學(xué)生關(guān)系參照了專業(yè)關(guān)系的主碼“專業(yè)號(hào)”。顯然,學(xué)生關(guān)系中的“專業(yè)號(hào)”值必須是確實(shí)存在的專業(yè)的專業(yè)號(hào),即專業(yè)關(guān)系中有該專業(yè)的記錄。這也就是說(shuō),學(xué)生關(guān)系中的某個(gè)屬性的取值需要參照專業(yè)關(guān)系的屬性取值。 例7-4 學(xué)生、課程、學(xué)生與課程之間的多對(duì)多聯(lián)系可以用如下三個(gè)關(guān)系表示: 學(xué)生(學(xué)號(hào),姓名,性別,專業(yè)號(hào),年齡) 課程(課程號(hào),課程名,學(xué)分) 選修(學(xué)號(hào),課程號(hào),成績(jī)) 這三個(gè)關(guān)系之間也存在著屬性的引用,即選修關(guān)系引用了學(xué)生關(guān)系的主碼“學(xué)號(hào)”和課程關(guān)系的主碼“課程號(hào)”。同樣,選修關(guān)系中的“學(xué)號(hào)”值必須是確實(shí)存在的學(xué)生的學(xué)號(hào),即學(xué)生關(guān)系中有該學(xué)生的記錄

22、;選修關(guān)系中的“課程號(hào)”值必須是確實(shí)存在的課程的課程號(hào),即課程關(guān)系中有該課程的記錄。換句話說(shuō),選修關(guān)系 中某些屬性的取值需要參照其它關(guān)系的屬性取值。 不僅兩個(gè)或兩個(gè)以上的關(guān)系間可以存在引用關(guān)系,同一關(guān)系內(nèi)部屬性間也可能存在引用關(guān)系。 例7-5 如果在例7-1中的學(xué)生關(guān)系中增加一個(gè)屬性“班長(zhǎng)”,則原學(xué)生關(guān)系改為: 學(xué)生(學(xué)號(hào),姓名,性別,專業(yè)號(hào),年齡,班長(zhǎng)) 其中“班長(zhǎng)”屬性表示該學(xué)生所在班級(jí)的班長(zhǎng)的學(xué)號(hào),它引用了本關(guān)系“學(xué)號(hào)”屬性,即“班長(zhǎng)”必須是確實(shí)存在的學(xué)生的學(xué)號(hào)。 定義7-5 設(shè)F是關(guān)系R的一個(gè)或一組屬性,但不是關(guān)系R的碼。如果F與關(guān)系S的主碼相對(duì)應(yīng),則稱F是關(guān)系R的外碼(Foreign

23、 Key),并稱R為參照關(guān)系,S為被參照關(guān)系或目標(biāo)關(guān)系。 在例7-3中,學(xué)生關(guān)系的“專業(yè)號(hào)”屬性與專業(yè)關(guān)系的主碼“專業(yè)號(hào)”相對(duì)應(yīng),因此“專業(yè)號(hào)”屬性是學(xué)生關(guān)系的外碼,這里學(xué)生關(guān)系為參照關(guān)系,專業(yè)關(guān)系為被參照關(guān)系。如圖7-1(a)所示。圖7-1 關(guān)系的參照?qǐng)D 在例7-4中,選修關(guān)系的“學(xué)號(hào)”屬性與學(xué)生關(guān)系的主碼“學(xué)號(hào)”相對(duì)應(yīng),“課程號(hào)”屬性與課程關(guān)系的主碼“課程號(hào)”相對(duì)應(yīng),因此“學(xué)號(hào)”和“課程號(hào)”屬性是選修關(guān)系的外碼,這里選修關(guān)系為參照關(guān)系,學(xué)生關(guān)系和課程關(guān)系均為被參照關(guān)系。如圖7-1(b)所示。 在例7-5中,“班長(zhǎng)”屬性與本身的主碼“學(xué)號(hào)”屬性相對(duì)應(yīng),因此“班長(zhǎng)”是外碼。這里的學(xué)生關(guān)系既是參

24、照關(guān)系也是被參照關(guān)系。 需要指出的是,外碼并不一定要與相應(yīng)的主碼同名(如例7-5)。不過(guò),在實(shí)際應(yīng)用中,為了便于識(shí)別,當(dāng)外碼與相應(yīng)的主碼屬于不同關(guān)系時(shí),往往給它們?nèi)∠嗤拿帧?參照完整性規(guī)則就是定義外碼與主碼之間的引用規(guī)則。 規(guī)則7-2 參照完整性規(guī)則 若屬性(或?qū)傩越M)F是關(guān)系R的外碼,它與關(guān)系S的主碼相對(duì)應(yīng)(關(guān)系R和S不一定是不同的關(guān)系),則對(duì)于R中的每個(gè)元組在F上的值必須為: 或者取空值(F的每個(gè)屬性值均為空值); 或者等于S中某個(gè)元組的主碼值。 例如,對(duì)于例7-3,學(xué)生關(guān)系中每個(gè)元組的“專業(yè)號(hào)”屬性只能取下面兩類值: (1) 空值,表示尚未給該學(xué)生分配專業(yè); (2) 非空值,這時(shí)該值

25、必須是專業(yè)關(guān)系中某個(gè)元組的“專業(yè)號(hào)”值,表示該學(xué)生分配到一個(gè)確實(shí)存在的專業(yè)中。即被參照關(guān)系“專業(yè)”中一定存在一個(gè)元組,它的主碼值等于該參照關(guān)系“學(xué)生”中的外碼值。 對(duì)于例7-4,按照參照完整性規(guī)則,“學(xué)號(hào)”和“課程號(hào)”屬性也可以取兩類值:空值或目標(biāo)關(guān)系中已經(jīng)存在的值。但由于“學(xué)號(hào)”和“課程號(hào)”是選修關(guān)系中的主屬性,按照實(shí)體完整性規(guī)則,它們均不能取空值。所以選修關(guān)系中的“學(xué)號(hào)”和“課程號(hào)”屬性實(shí)際上只能取相應(yīng)被參照關(guān)系中已經(jīng)存在的主碼值。 參照完整性規(guī)則中,R與S可以是同一個(gè)關(guān)系。例如對(duì)于例7-5,按照參照完整性規(guī)則,“班長(zhǎng)”屬性值可以取兩類值: (1) 空值,表示該學(xué)生所在班級(jí)尚未選出班長(zhǎng);

26、(2) 非空值,這時(shí)該值必須是本關(guān)系中某個(gè)元組的學(xué)號(hào)值。 7.3.4 用戶定義的完整性 任何關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)都應(yīng)該支持實(shí)體完整性和參照完整性。除此之外,關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)根據(jù)現(xiàn)實(shí)世界中其應(yīng)用環(huán)境的不同,往往還需要一些另外的約束條件,用戶定義的完整性就是針對(duì)某一具體應(yīng)用要求來(lái)定義的約束條件,它反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的語(yǔ)義要求。例如某個(gè)屬性必須取惟一值,某些屬性值之間應(yīng)滿足一定的函數(shù)關(guān)系,某個(gè)屬性的取值范圍在0100之間等。關(guān)系模型應(yīng)提供定義和檢驗(yàn)這類完整性的機(jī)制,以便系統(tǒng)用統(tǒng)一的方法處理它們,而不需要由應(yīng)用程序承擔(dān)這一功能。 所以,用戶定義的完整性通常是定義對(duì)關(guān)系中除主碼與外碼屬性之外的

27、其它屬性取值的約束,即對(duì)其它屬性的值域的約束。 對(duì)屬性的值域的約束也稱為域完整性規(guī)則(Domain Integrity Rule),是指對(duì)關(guān)系中屬性取值的正確性限制,包括數(shù)據(jù)類型、精度、取值范圍、是否允許空值等。取值范圍又可分為靜態(tài)定義和動(dòng)態(tài)定義兩種,靜態(tài)定義取值范圍是指屬性的值域范圍是固定的,可從定義值的集合中提取特定值;動(dòng)態(tài)定義取值范圍是指屬性的值域范圍依賴于另一個(gè)或多個(gè)其它屬性的值。 為了維護(hù)數(shù)據(jù)庫(kù)中數(shù)據(jù)的完整性,在對(duì)關(guān)系數(shù)據(jù)庫(kù)執(zhí)行插入、刪除和修改操作時(shí),就要檢查數(shù)據(jù)庫(kù)是否滿足上述三類完整性規(guī)則。 (1) 當(dāng)執(zhí)行插入操作時(shí),首先檢查實(shí)體完整性規(guī)則,即插入行在主碼屬性上的值是否已經(jīng)存在,若

28、存在,可以執(zhí)行插入操作,否則不執(zhí)行插入操作。然后再檢查參照完整性規(guī)則,如果是向被參照關(guān)系插入,不需要考慮參照完整性規(guī)則;如果是向參照關(guān)系插入,插入行在外碼屬性上的值是否已經(jīng)在相應(yīng)被參照關(guān)系的主碼屬性值中存在。 若存在,可以執(zhí)行插入操作;否則不執(zhí)行插入操作,或?qū)⒉迦胄性谕獯a屬性上的值改為空值后再執(zhí)行插入操作(假定該外碼允許取空值)。最后檢查用戶定義的完整性規(guī)則,檢查要被插入的關(guān)系中是否定義了用戶定義完整性規(guī)則,如果定義了,檢查插入行在相應(yīng)屬性上的值是否遵守用戶定義的完整性規(guī)則。若遵守,可以執(zhí)行插入操作,否則不執(zhí)行插入操作。 (2) 當(dāng)執(zhí)行刪除操作時(shí),一般只需要檢查參照完整性規(guī)則。如果是刪除被參照

29、關(guān)系中的行,檢查被刪除行在主碼屬性上的值是否正在被相應(yīng)的參照關(guān)系的外碼引用,若沒(méi)有被引用,可以執(zhí)行刪除操作;若正在被引用,有三種可能的做法:不執(zhí)行刪除操作(拒絕刪除),或?qū)⒄贞P(guān)系中相應(yīng)行在外碼屬性上的值改為空值后再執(zhí)行刪除操作(空值刪除),或?qū)⒄贞P(guān)系中相應(yīng)行一起刪除(級(jí)聯(lián)刪除)。 (3) 當(dāng)執(zhí)行更新操作時(shí),因?yàn)楦虏僮骺煽闯墒窍葓?zhí)行刪除操作,再執(zhí)行插入操作,因此是上述兩種情況的綜合。7.4 關(guān) 系 代 數(shù) 關(guān)系代數(shù)是一種抽象的查詢語(yǔ)言,是關(guān)系數(shù)據(jù)操縱語(yǔ)言的一種傳統(tǒng)表達(dá)方式,它是用對(duì)關(guān)系的運(yùn)算來(lái)表達(dá)查詢的。任何一種運(yùn)算都是將一定的運(yùn)輸符作用于一定的運(yùn)算對(duì)象上,得到預(yù)期的運(yùn)算結(jié)果,所以運(yùn)算對(duì)象

30、、運(yùn)算符、運(yùn)算結(jié)果是運(yùn)算的三大要素。關(guān)系代數(shù)的運(yùn)算對(duì)象是關(guān)系,運(yùn)算結(jié)果也是關(guān)系。關(guān)系代數(shù)用到的運(yùn)算符包括四類:集合運(yùn)算符、專門的關(guān)系運(yùn)算符、比較運(yùn)算符和邏輯運(yùn)算符,其中比較運(yùn)算符和邏輯運(yùn)算符是用來(lái)輔助專門的關(guān)系運(yùn)算符進(jìn)行操作的。如表7-6所示。 表7-6 關(guān)系代數(shù)運(yùn)算符運(yùn) 算 符含 義運(yùn) 算 符含 義集合運(yùn)算符并差交廣義笛卡兒乘積比較運(yùn)算符大于大于等于小于小于等于等于不等于專門的關(guān)系運(yùn)算符選擇投影連接除邏輯運(yùn)算符非與或 關(guān)系代數(shù)的運(yùn)算按運(yùn)算符的不同可分為傳統(tǒng)的集合運(yùn)算和專門的關(guān)系運(yùn)算兩類。其中傳統(tǒng)的集合運(yùn)算將關(guān)系看成元組的集合,其運(yùn)算是從關(guān)系的“水平”方向,即行的角度來(lái)進(jìn)行。而專門的關(guān)系運(yùn)算不

31、僅涉及行而且涉及列。 7.4.1 傳統(tǒng)的集合運(yùn)算 傳統(tǒng)的集合運(yùn)算是二目運(yùn)算,包括并、差、交、廣義笛卡兒乘積四種運(yùn)算。 定義7-6 同一關(guān)系模式(關(guān)系框架)填以不同的值所生成的諸關(guān)系稱為同類關(guān)系。 例如圖7-2所示的關(guān)系R和關(guān)系S是同類關(guān)系。圖7-2 同類關(guān)系R,S 1并(Union) 設(shè)有同類關(guān)系R和S,則它們的并記為RS,仍然是R和S的同類關(guān)系,由屬于R或?qū)儆赟的元組組成,但必須除去重復(fù)的元組:RS = t | tRtS其中t為元組。 2差(Difference) 設(shè)有同類關(guān)系R和S,則它們的差記為RS,仍然是R和S的同類關(guān)系,由屬于R但不屬于S的元組組成:RS = t | tRtS 3交(

32、Intersection) 設(shè)有同類關(guān)系R和S,則它們的交記為RS,仍然是R和S的同類關(guān)系,由既屬于R又屬于S的元組組成:RS = t | tRtS 求兩個(gè)同類關(guān)系的交運(yùn)算可以用兩次差運(yùn)算所取代,即RS = R (RS)。用文氏圖來(lái)表示,如圖7-3所示,其正確性是顯而易見(jiàn)的。圖7-3 文氏圖 4廣義笛卡兒乘積(Extended Cartesian Product) 設(shè)R為m元關(guān)系,S為n元關(guān)系,則R和S的廣義笛卡兒乘積RS是一個(gè)(m+n)元關(guān)系,其中任一元組的前m個(gè)分量是R的一個(gè)元組,后n個(gè)分量是S的一個(gè)元組。RS是所有具備這種條件的元組的集合。實(shí)際進(jìn)行組合時(shí),可從R的第一個(gè)元組開(kāi)始,依次與S

33、的所有元組組合,然后對(duì)R的其它元組進(jìn)行同樣的操作,即可得到RS的全部元組。若關(guān)系R有K1個(gè)元組,關(guān)系S有K2個(gè)元組,則R和S的笛卡爾乘積RS有K1K2個(gè)元組。記為: RS = tr ts | trRtsS 例7-6 針對(duì)圖7-2的關(guān)系R和S,則R和S的并、差、交以及廣義的笛卡兒乘積見(jiàn)圖7-4所示。 圖7-4 關(guān)系的并、差、交、廣義笛卡兒乘積 7.4.2 專門的關(guān)系運(yùn)算 專門的關(guān)系運(yùn)算包括選擇、投影、連接、除等。為了敘述上的方便,先引入幾個(gè)記號(hào)。 (1) 設(shè)關(guān)系模式為R(A1,A2,An),它的一個(gè)關(guān)系設(shè)為R,tR表示t是R的一個(gè)元組,tAi則表示元組t中相應(yīng)于屬性Ai的一個(gè)分量。 (2) 若A

34、=Ai1,Ai2,Aik,其中Ai1,Ai2,Aik是A1,A2,An中的一部分,則A稱為屬性列或域列。tA=(tAi1,tAi2,tAik)表示元組t在屬性列A上諸分量的集合。則表示A1,A2,An中去掉 Ai1,Ai2,Aik后剩余的屬性組。 (3) R是n元關(guān)系,S是m元關(guān)系,trR,tsS,tr ts稱為元組的連接,它是一個(gè)(n+m)列的元組,前n個(gè)分量為R中的一個(gè)n元組,后m個(gè)分量為S中的一個(gè)m元組。 (4) 給定一個(gè)關(guān)系R(X,Y),X和Y為屬性組,當(dāng)tX=x時(shí),x在R中的像集定義為Yx=tY | tR,tX=x它表示R中屬性組X上值為x的諸元組在Y上分量的集合。 1選擇(Sele

35、ction) 選擇是在關(guān)系R中選擇滿足給定條件的諸元組,記作F(R)= t | tRF(t)=真 其中F表示選擇條件,它是一個(gè)邏輯表達(dá)式,取邏輯值“真”或“假”。 邏輯表達(dá)式F由邏輯運(yùn)算符 、連接各算術(shù)表達(dá)式組成。算術(shù)表達(dá)式的基本形式為X1Y1其中表示比較運(yùn)算符,它可以是、或。X1、Y1等是屬性名,或?yàn)槌A?,或?yàn)楹?jiǎn)單函數(shù);屬性名也可以用它的序號(hào)來(lái)代替。 選擇運(yùn)算實(shí)際上是從關(guān)系R中選取使邏輯表達(dá)式F為真的元組。這是從行的角度進(jìn)行的運(yùn)算,運(yùn)算結(jié)果是關(guān)系R中“行的子集”。 設(shè)有一個(gè)學(xué)生課程數(shù)據(jù)庫(kù),包括學(xué)生關(guān)系Student、課程關(guān)系Course和選修關(guān)系SC,如圖7-5所示。以后的許多例子將對(duì)這三個(gè)

36、關(guān)系進(jìn)行運(yùn)算。 圖7-5 學(xué)生課程數(shù)據(jù)庫(kù)例7-7 查詢信息系(IS系)全體學(xué)生。關(guān)系代數(shù)表達(dá)式為dept=IS(Student) 或 5=IS(Student)其中下角標(biāo)“5”為dept的屬性序號(hào)。結(jié)果如圖7-6(a)所示。例7-8 查詢年齡小于20歲的學(xué)生。關(guān)系代數(shù)表達(dá)式為 age20(Student) 或 420(Student)結(jié)果如圖7-6(b)所示。圖7-6 選擇運(yùn)算舉例 2投影(Projection) 關(guān)系R上的投影是從R中選擇出若干屬性列組成新的關(guān)系。記作 A(R)= tA | tR 其中A為R中的屬性列。投影操作是從列的角度進(jìn)行的運(yùn)算。 例7-9 查詢學(xué)生的姓名和所在系,即求S

37、tudent關(guān)系在學(xué)生姓名和所在系兩個(gè)屬性上的投影。關(guān)系代數(shù)表達(dá)式為 Sname, dept(Student) 或2, 5(Student) 結(jié)果如圖7-7(a)所示。 投影之后不僅取消了原關(guān)系中的某些列,而且還可能取消某些元組,因?yàn)槿∠四承傩粤泻?,就可能出現(xiàn)重復(fù)行,應(yīng)取消這些完全相同的行。 圖7-7 投影運(yùn)算舉例 例7-10 查詢學(xué)生關(guān)系Student中都有哪些系,即查詢Student在所在系屬性上的投影。關(guān)系代數(shù)表達(dá)式為dept(Student) 或 5(Student) 結(jié)果如圖7-7(b)所示。Student關(guān)系原來(lái)有四個(gè)元組,而投影結(jié)果取消了重復(fù)的IS元組,因此只有三個(gè)元組。 3

38、連接(Join) 連接也稱為連接,它是從兩個(gè)關(guān)系的笛卡兒乘積中選取屬性間滿足一定條件的元組。記作 R S = tr ts | trRtsStrAtsB AB 其中A和B分別為R和S上度數(shù)相等且可比的屬性組,是比較運(yùn)算符。連接運(yùn)算從R和S的廣義笛卡兒乘積RS中選取(R關(guān)系)在A屬性組上的值與(S關(guān)系)在B屬性組上的值滿足比較運(yùn)算的元組。 其中A和B分別為R和S上度數(shù)相等且可比的屬性組,是比較運(yùn)算符。連接運(yùn)算從R和S的廣義笛卡兒乘積RS中選取(R關(guān)系)在A屬性組上的值與(S關(guān)系)在B屬性組上的值滿足比較運(yùn)算的元組。 連接運(yùn)算中有兩種最為重要也最為常用的連接,一種是等值連接(Equi-join),另

39、一種是自然連接(Natural join)。 1) 等值連接 連接運(yùn)算中,可以是比較運(yùn)算符、中的任何一種。當(dāng)為“”的連接運(yùn)算稱為等值連接。它是從關(guān)系R與S的廣義笛卡兒乘積中選取A,B屬性值相等的那些元組,即等值連接為 R S = tr ts | trRtsStrAtsB AB 2) 自然連接 自然連接是一種特殊的等值連接,它要求兩個(gè)關(guān)系中進(jìn)行比較的分量必須是相同的屬性組,并且要在結(jié)果中把重復(fù)的屬性去掉。即若R和S具有相同的屬性組B,則自然連接可記作 R S = tr ts | trRtsStrBtsB 一般的連接操作是從行的角度進(jìn)行運(yùn)算,但自然連接還需要取消重復(fù)列,所以是同時(shí)從行和列的角度進(jìn)行

40、運(yùn)算。 由以上定義可知,連接運(yùn)算是一種有選擇的笛卡兒乘積,其選擇條件是運(yùn)算。因此連接能用關(guān)系的笛卡兒乘積和選擇的合成形式表示為 R S =AB(RS) AB 自然連接運(yùn)算是對(duì)關(guān)系R和S的笛卡爾乘積進(jìn)行選擇運(yùn)算,只保留同名屬性值相等的那些元組,然后再對(duì)其進(jìn)行投影運(yùn)算去掉重復(fù)的同名屬性。則兩個(gè)關(guān)系R和S的自然連接計(jì)算過(guò)程如下: (1) 計(jì)算RS; (2) 設(shè)A1,A2,Ak是R和S的公共屬性,挑選RS中滿足R.A1=S.A1,R.Ak= S.Ak的那些元組; (3) 去掉S.A1,S.Ak這些列。 例7-11 圖7-8中(a)和(b)分別為關(guān)系R和關(guān)系S,則圖7-8(c)為R S的結(jié)果,圖7-8(

41、d)為等值連接R S的結(jié)果,圖7-8(e)為自然連接R S的結(jié)果。CER.B=S.B 圖7-8 連接運(yùn)算舉例 4除(Division) 給定關(guān)系R(X,Y)和S(Y,Z),其中X,Y,Z為屬性組,R中的Y與S中的Y可以有不同的屬性名,但必須出自相同的域。R與S的除運(yùn)算得到一個(gè)新的關(guān)系P(X),P是R中滿足下列條件的元組在X屬性列上的投影:元組在X上分量值x的象集Yx包含S在Y上投影的集合。記作RS = trX | trRY(S)Yx其中Yx為x在R中的象集,x = trX。除操作是同時(shí)從行和列角度進(jìn)行運(yùn)算。RS可分解為若干個(gè)基本的關(guān)系代數(shù)操作,具體計(jì)算過(guò)程如下:(1) 求出R中X的各個(gè)分量的象

42、集Yx;(2) 求出S在Y上投影的集合Y(S);(3) 比較Yx和Y(S),選取滿足Y(S)Yx的分量,記為X;(4) RS = X。例7-12 設(shè)關(guān)系R,S分別如圖7-9中的(a)和(b)所示,RS的結(jié)果如圖7-9(c)所示。在關(guān)系R中,A可以取四個(gè)值a1,a2,a3,a4。其中:a1的象集為(b1,c2),(b2,c3),(b2,c1);a2的象集為(b3,c7),(b2,c3);a3的象集為(b4,c6);a4的象集為(b6,c6);S在(B,C)上的投影為(b1,c2),(b2,c1),(b2,c3 )。 顯然只有a1的象集包含了S在(B,C)屬性組上的投影,所以RS = a1。 圖7

43、-9 除運(yùn)算 下面再以學(xué)生課程數(shù)據(jù)庫(kù)為例,給出幾個(gè)綜合應(yīng)用多種關(guān)系代數(shù)運(yùn)算進(jìn)行查詢的例子。 例7-13 查詢至少選修1號(hào)課程和3號(hào)課程的學(xué)生號(hào)碼。首先建立一個(gè)臨時(shí)關(guān)系K: Cno13然后求:Sno,Cno(SC)K結(jié)果為02001。例7-14 查詢選修了2號(hào)課程的學(xué)生的學(xué)號(hào)。Sno(Cno=2(SC) = 02001,02002例 7-15 查詢至少選修了一門其直接先行課為5號(hào)課程的學(xué)生姓名。Sname(Pno=5(Course) SC Sno,Sname(Student)或Sname(Sno(Pno=5(Course) SC) Sno,Sname(Student)例7-16 查詢選修了全部課

44、程的學(xué)生學(xué)號(hào)和姓名。Sno,Cno(SC)Cno(Course) Sno,Sname(Student) 本節(jié)介紹了8種關(guān)系代數(shù)運(yùn)算,其中并、差、笛卡兒乘積、投影和選擇5種運(yùn)算為基本運(yùn)算,其它3種運(yùn)算,即交、連接和除均可以用這5種基本運(yùn)算來(lái)表達(dá)。引進(jìn)它們并不增加語(yǔ)言的能力,但可以簡(jiǎn)化表達(dá)。7.5 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL 7.5.1 SQL概述 1SQL簡(jiǎn)介 SQL(Structured Query Language)語(yǔ)言是1974年由Boyce和Chamberlin提出的,1975年至1979年,IBM公司San Jose Research Laboratory研制了關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)的原型S

45、ystem R并實(shí)現(xiàn)了這種語(yǔ)言。由于它功能豐富,語(yǔ)言簡(jiǎn)潔倍受用戶及計(jì)算機(jī)工業(yè)界歡迎,被眾多計(jì)算機(jī)公司和軟件公司所采用。 經(jīng)各公司的不斷修改、擴(kuò)充和完善,SQL語(yǔ)言最終發(fā)展成為關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言。 1986年10月美國(guó)國(guó)家標(biāo)準(zhǔn)局(ANSI,American National Standard Institute)頒布了SQL語(yǔ)言的美國(guó)標(biāo)準(zhǔn),該標(biāo)準(zhǔn)也稱為SQL86。1987年6月SQL86被國(guó)際標(biāo)準(zhǔn)化組織(ISO,International Organization for Standardization)采納為國(guó)際標(biāo)準(zhǔn)。 此后ANSI不斷修改和完善SQL標(biāo)準(zhǔn),并于1989年4月頒布增強(qiáng)了完整性

46、特征的SQL89標(biāo)準(zhǔn),1992年公布了SQL92標(biāo)準(zhǔn),也稱SQL2。從SQL89到SQL92其內(nèi)容在許多方面得到擴(kuò)充。1999年又發(fā)布了SQL99,也即SQL3,它是在SQL2的基礎(chǔ)上擴(kuò)展了許多新的特性,如遞歸、觸發(fā)器以及對(duì)象等。 SQL成為國(guó)際標(biāo)準(zhǔn)語(yǔ)言以后,各個(gè)數(shù)據(jù)庫(kù)廠家紛紛推出各自的SQL軟件或與SQL的接口軟件。這就有可能使大多數(shù)數(shù)據(jù)庫(kù)均用SQL作為共同的數(shù)據(jù)庫(kù)語(yǔ)言和標(biāo)準(zhǔn)接口,使不同數(shù)據(jù)庫(kù)系統(tǒng)之間的互操作有了共同的基礎(chǔ)。而且對(duì)數(shù)據(jù)庫(kù)以外的領(lǐng)域也產(chǎn)生了很大影響,有不少軟件產(chǎn)品將SQL語(yǔ)言的數(shù)據(jù)查詢功能與圖形功能、軟件工程工具、軟件開(kāi)發(fā)工具、人工智能程序結(jié)合起來(lái)。SQL已成為關(guān)系數(shù)據(jù)庫(kù)領(lǐng)域中

47、一個(gè)主流語(yǔ)言。 2SQL特點(diǎn) SQL語(yǔ)言之所以能夠?yàn)橛脩艉蜆I(yè)界所接受,并成為國(guó)際標(biāo)準(zhǔn),因?yàn)樗且粋€(gè)綜合的、通用的、功能極強(qiáng)同時(shí)又簡(jiǎn)潔易學(xué)的語(yǔ)言。SQL語(yǔ)言集數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制功能于一體,充分體現(xiàn)了關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言的特點(diǎn)和優(yōu)點(diǎn)。其主要特點(diǎn)包括: 1) 綜合統(tǒng)一 數(shù)據(jù)庫(kù)的主要功能是通過(guò)數(shù)據(jù)庫(kù)支持的數(shù)據(jù)語(yǔ)言來(lái)實(shí)現(xiàn)的。SQL語(yǔ)言集數(shù)據(jù)定義語(yǔ)言DDL、數(shù)據(jù)操縱語(yǔ)言DML、數(shù)據(jù)控制語(yǔ)言DCL的功能于一體,語(yǔ)言風(fēng)格統(tǒng)一,可以獨(dú)立完成數(shù)據(jù)庫(kù)生命周期中的全部活動(dòng)。另外,在關(guān)系模型中,實(shí)體和實(shí)體間的聯(lián)系均用關(guān)系表示,這種數(shù)據(jù)結(jié)構(gòu)的單一性帶來(lái)了數(shù)據(jù)操作符的統(tǒng)一性,查找、插入、刪除、更新等每一種操作

48、都只需一種操作符。 2) 高度非過(guò)程化 用SQL語(yǔ)言進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),用戶只需提出“做什么”,而不必指明“怎么做”。因此,用戶無(wú)需了解數(shù)據(jù)存取路徑,存取路徑的選擇以及SQL語(yǔ)句的操作過(guò)程由系統(tǒng)自動(dòng)完成。這不但大大減輕了用戶負(fù)擔(dān),而且有利于提高數(shù)據(jù)獨(dú)立性。 3) 面向集合的操作方式 非關(guān)系數(shù)據(jù)模型采用的是面向記錄的操作方式,操作對(duì)象是一條記錄。例如查詢所有平均成績(jī)?cè)?0分以上的學(xué)生姓名,用戶必須一條一條地把滿足條件的學(xué)生記錄找出來(lái)(通常要說(shuō)明具體處理過(guò)程,即按照哪條路徑,如何循環(huán)等)。而SQL語(yǔ)言采用集合操作方式,不僅操作對(duì)象、查找結(jié)果可以是元組的集合,而且一次插入、刪除、更新操作的對(duì)象也可以是

49、元組的集合。 4) 以同一種語(yǔ)法結(jié)構(gòu)提供兩種使用方式 SQL語(yǔ)言既是自含式語(yǔ)言,又是嵌入式語(yǔ)言。作為自含式語(yǔ)言,它能夠獨(dú)立地用于聯(lián)機(jī)交互的使用方式,用戶可以在終端鍵盤上直接鍵入SQL命令對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作;作為嵌入式語(yǔ)言,SQL語(yǔ)句能夠嵌入到高級(jí)語(yǔ)言(例如C,COBOL,PL/1等)程序中,供程序員設(shè)計(jì)程序時(shí)使用。在兩種不同的使用方式下,SQL語(yǔ)言的語(yǔ)法結(jié)構(gòu)基本上是一致的。這種以統(tǒng)一的語(yǔ)法結(jié)構(gòu)提供兩種不同的使用方法的做法,提供了極大的靈活性與方便性。 5) 語(yǔ)言簡(jiǎn)潔,易學(xué)易用 SQL語(yǔ)言功能極強(qiáng),由于設(shè)計(jì)巧妙,語(yǔ)言十分簡(jiǎn)潔,完成核心功能只用了9個(gè)動(dòng)詞,如表7-7所示。而且SQL語(yǔ)言語(yǔ)法簡(jiǎn)單,接近

50、英語(yǔ)口語(yǔ),因此容易學(xué)習(xí),容易使用。表7-7 SQL語(yǔ)言的動(dòng)詞SQL的功能動(dòng) 詞數(shù)據(jù)查詢SELECT數(shù)據(jù)定義CREATE,DROP,ALTER數(shù)據(jù)操縱INSERT,DELETE,UPDATE數(shù)據(jù)控制GRANT,REVOKE 3SQL數(shù)據(jù)庫(kù)的體系結(jié)構(gòu) SQL語(yǔ)言支持關(guān)系數(shù)據(jù)庫(kù)三級(jí)模式結(jié)構(gòu),如圖7-10所示。其中外模式對(duì)應(yīng)于視圖(View)和部分基本表(Base Table),模式對(duì)應(yīng)于基本表,內(nèi)模式對(duì)應(yīng)于存儲(chǔ)文件。圖7-10 SQL對(duì)關(guān)系數(shù)據(jù)庫(kù)模式的支持 用戶可以用SQL語(yǔ)言對(duì)基本表和視圖進(jìn)行查詢或其它操作,基本表和視圖一樣,都是關(guān)系?;颈硎潜旧愍?dú)立存在的表;視圖是從一個(gè)或幾個(gè)基本表導(dǎo)出的表。視

51、圖本身不獨(dú)立存儲(chǔ)在數(shù)據(jù)庫(kù)中,即數(shù)據(jù)庫(kù)中只存放視圖的定義而不存放視圖對(duì)應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍存放在導(dǎo)出視圖的基本表中,因此視圖是一個(gè)虛表。視圖在概念上與基本表等同,用戶可以在視圖上再定義視圖。 一個(gè)或多個(gè)基本表對(duì)應(yīng)一個(gè)存儲(chǔ)文件,一個(gè)基本表可以帶若干索引,索引也存放在存儲(chǔ)文件中。存儲(chǔ)文件的邏輯結(jié)構(gòu)組成了關(guān)系數(shù)據(jù)庫(kù)的內(nèi)模式;存儲(chǔ)文件的物理結(jié)構(gòu)是任意的,對(duì)用戶是透明的。 7.5.2 SQL的數(shù)據(jù)定義 SQL語(yǔ)言支持?jǐn)?shù)據(jù)庫(kù)三級(jí)模式結(jié)構(gòu),其模式、外模式和內(nèi)模式中的基本對(duì)象有表、視圖和索引。因此SQL的數(shù)據(jù)定義功能包括定義表、視圖和索引,如表7-8所示。由于視圖是基于基本表的虛表,索引是依附于基本表的,因此S

52、QL通常不提供修改視圖定義和修改索引定義的操作。用戶如果想修改視圖定義或索引定義,只能先將它們刪除掉,然后再重建。不過(guò)有些關(guān)系數(shù)據(jù)庫(kù)產(chǎn)品如Oracle允許直接修改視圖定義。表7-8 SQL的數(shù)據(jù)定義語(yǔ)句操作對(duì)象操 作 方 式創(chuàng) 建刪 除修 改表CREATE TABLEDROP TABLEALTER TABLE視圖CREATE VIEWDROP VIEW索引CREATE INDEXDROW INDEX 1基本表1) 創(chuàng)建基本表SQL語(yǔ)言使用CREATE TABLE語(yǔ)句創(chuàng)建基本表,其一般格式為CREATE TABLE ( 列級(jí)完整性約束條件, 列級(jí)完整性約束條件 ,); 其中,是所要?jiǎng)?chuàng)建的基本表的

53、名字,它可以由一個(gè)或多個(gè)屬性(列)組成。建表的同時(shí)通常還可以定義與該表有關(guān)的完整性約束,這些完整性約束條件被存入系統(tǒng)的數(shù)據(jù)字典中,當(dāng)用戶操作表中數(shù)據(jù)時(shí)由DBMS自動(dòng)檢查該操作是否違背這些完整性約束條件。如果完整性約束條件涉及到該表的多個(gè)屬性列,則必須定義在表級(jí)上,否則既可以定義在列級(jí)也可以定義在表級(jí)。 定義表的各個(gè)屬性時(shí)需要指明其。不同的數(shù)據(jù)庫(kù)系統(tǒng)支持的數(shù)據(jù)類型不完全相同,實(shí)際使用時(shí)應(yīng)根據(jù)具體數(shù)據(jù)庫(kù)系統(tǒng)支持的數(shù)據(jù)類型聲明。 例7-17 建立一個(gè)職工表emp,它由職工號(hào)eno、姓名ename、性別sex、年齡age、部門dept五個(gè)屬性組成,其中職工號(hào)不能為空且取值惟一。CREATE TABLE

54、 emp(eno CHAR(5) NOT NULL UNIQUE,ename CHAR(8),sex CHAR(1),age INT,dept CHAR(16); 執(zhí)行上面的CREATE TABLE語(yǔ)句后,就在數(shù)據(jù)庫(kù)中建立了一個(gè)新的空的職工表emp,并將有關(guān)職工表的定義及有關(guān)約束條件存放在數(shù)據(jù)字典中。 SQL支持空值的概念,空值是不知道的值,任何列可以有空值,除非在CREATE TABLE語(yǔ)句列的定義中指定了NOT NULL。例如在表emp中eno列就不能出現(xiàn)空值,而其它列則允許有空值。 2) 修改基本表 隨著應(yīng)用環(huán)境和應(yīng)用需求的變化,有時(shí)需要修改已建立好的基本表,SQL語(yǔ)言用ALTER TA

55、BLE語(yǔ)句修改基本表,其一般格式為 ALTER TABLE ADD 完整性約束 DROP MODIFY ; 其中,是要修改的基本表,ADD子句用于增加新列和新的完整性約束條件,DROP子句用于刪除指定的完整性約束條件,MODIFY子句用于修改原有的列定義。 例7-18 向emp表增加職工工作時(shí)間come列,其數(shù)據(jù)類型為日期型。ALTER TABLE emp ADD come DATE; 不論基本表中原來(lái)是否已有數(shù)據(jù),新增加的列一律為空值。 SQL沒(méi)有提供刪除屬性列的語(yǔ)句,用戶只能間接實(shí)現(xiàn)這一功能,即先將原表中要保留的列及其值復(fù)制到一個(gè)新表中,然后刪除原表,再將新表重新命名為原表名。 3) 刪除

56、基本表 當(dāng)某個(gè)基本表不再需要時(shí),可以使用SQL語(yǔ)句DROP TABLE進(jìn)行刪除,其一般格式為DROP TABLE ;例7-19 刪除emp表。DROP TABLE emp; 基本表一旦被刪除,表中的數(shù)據(jù)和在此表上建立的索引都將自動(dòng)被刪除掉,而建立在此表上的視圖雖仍然保留,但已無(wú)法引用。因此,執(zhí)行刪除基本表操作一定要格外小心。 2索引 建立索引是加快表的查詢速度的有效手段。用戶可以根據(jù)應(yīng)用環(huán)境的需要,在基本表上建立一個(gè)或多個(gè)索引,以提供多種存取路徑,加快查找速度。一般說(shuō)來(lái),建立與刪除索引由數(shù)據(jù)庫(kù)管理員DBA或表的屬主(即建立表的人)負(fù)責(zé)完成。系統(tǒng)在存取數(shù)據(jù)時(shí)會(huì)自動(dòng)選擇合適的索引作為存取路徑,用戶

57、不必也不能選擇索引。 1) 建立索引 在SQL語(yǔ)言中,建立索引使用CREATE INDEX語(yǔ)句,其一般格式為 CREATE UNIQUE CLUSTER INDEX ON (,); 其中,是要建索引的基本表的名字。索引可以建立在該表的一列或多列上,各列名之間用逗號(hào)分隔。每個(gè)后面還可以用指定索引值的排列次序,可選ASC(升序)或DESC(降序),缺省值為ASC。 UNIQUE表明此索引的每一個(gè)索引值只對(duì)應(yīng)惟一的數(shù)據(jù)記錄。 CLUSTER表示要建立的索引是聚簇索引。所謂聚簇索引是指索引項(xiàng)的順序與表中記錄的物理順序一致的索引組織。用戶可以在最頻繁查詢的列上建立聚簇索引以提高查詢速度。顯然,在一個(gè)基本

58、表上最多只能建立一個(gè)聚簇索引。建立聚簇索引后,更新索引列數(shù)據(jù)時(shí),往往導(dǎo)致表中記錄的物理順序的變更,代價(jià)較大,因此對(duì)于經(jīng)常更新的列不宜建立聚簇索引。 例7-20 為職工表emp建立索引,按職工號(hào)升序和姓名降序建惟一索引。 CREATE UNIQUE INDEX no_index ON emp(eno ASC, ename DESC); 2) 刪除索引 索引一經(jīng)建立,就由系統(tǒng)使用和維護(hù)它,不需用戶干預(yù)。建立索引是為了減少查詢操作的時(shí)間,但如果數(shù)據(jù)增、刪、改頻繁,系統(tǒng)會(huì)花費(fèi)許多時(shí)間來(lái)維護(hù)索引。這時(shí),可以刪除一些不必要的索引。 在SQL語(yǔ)言中,刪除索引使用DROP INDEX語(yǔ)句,其一般格式為DROP

59、 INDEX ; 例7-21 刪除emp表上的no_index索引。 DROP INDEX no_index; 刪除索引時(shí),系統(tǒng)會(huì)同時(shí)從數(shù)據(jù)字典中刪去有關(guān)該索引的描述。 7.5.3 SQL的數(shù)據(jù)查詢 數(shù)據(jù)庫(kù)查詢是數(shù)據(jù)庫(kù)的核心操作。SQL語(yǔ)言提供了SELECT語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)的查詢,該語(yǔ)句具有靈活的使用方式和豐富的功能。其一般格式為 SELECT ALL | DISTINCT , FROM , WHERE GROUP BY HAVING ORDER BY ASC | DESC 整個(gè)語(yǔ)句的含義是:根據(jù)WHERE子句的條件表達(dá)式,從FROM子句指定的基本表或視圖中找出滿足條件的元組,再按SELECT子

60、句中的目標(biāo)列表達(dá)式,選出元組中的屬性值形成結(jié)果表。如果有GROUP子句,則將結(jié)果按的值進(jìn)行分組,該屬性列值相等的元組為一個(gè)組,每個(gè)組產(chǎn)生結(jié)果表中的一個(gè)元組,通常會(huì)在每組中作用集函數(shù)。如果GROUP子句帶HAVING短語(yǔ),則只有滿足指定條件的組才予輸出。如果有ORDER子句,則結(jié)果表還要按的值的升序或降序排序。 SELECT語(yǔ)句既可以完成簡(jiǎn)單的單表查詢,也可以完成復(fù)雜的連接查詢和嵌套查詢。下面以圖7-5中的學(xué)生課程數(shù)據(jù)庫(kù)為例說(shuō)明SELECT語(yǔ)句的各種用法。學(xué)生課程數(shù)據(jù)庫(kù)中包括3個(gè)基本表: 學(xué)生表:Student(Sno,Sname,sex,age,dept)。Student由學(xué)號(hào)(Sno)、姓名

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論