數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用課件匯 下 林育蓓 關(guān)系模式范式-大數(shù)據(jù)時(shí)代的數(shù)據(jù)管理_第1頁(yè)
數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用課件匯 下 林育蓓 關(guān)系模式范式-大數(shù)據(jù)時(shí)代的數(shù)據(jù)管理_第2頁(yè)
數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用課件匯 下 林育蓓 關(guān)系模式范式-大數(shù)據(jù)時(shí)代的數(shù)據(jù)管理_第3頁(yè)
數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用課件匯 下 林育蓓 關(guān)系模式范式-大數(shù)據(jù)時(shí)代的數(shù)據(jù)管理_第4頁(yè)
數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用課件匯 下 林育蓓 關(guān)系模式范式-大數(shù)據(jù)時(shí)代的數(shù)據(jù)管理_第5頁(yè)
已閱讀5頁(yè),還剩302頁(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)介

DatabaseTechnology&Applications數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用關(guān)系模式范式關(guān)系模式的范式關(guān)系模式的范式指的是關(guān)系模式應(yīng)該遵循的規(guī)范化形式。第一范式第二范式第三范式BC范式第一范式對(duì)于關(guān)系模式R,如果其每個(gè)屬性都是簡(jiǎn)單屬性,即每個(gè)屬性都是不可再分的,則稱R屬于第一范式,簡(jiǎn)記為1NF。關(guān)系模式的第一范式是關(guān)系模式要遵循的最基本的規(guī)范化形式。第一范式【例6.17】設(shè)有以下關(guān)系r,請(qǐng)問(wèn)r是否屬于第一范式?學(xué)號(hào)姓名電話202113871633李M)H)202113871634章M)【解答】由于在關(guān)系r中,電話屬性可進(jìn)一步劃分為移動(dòng)電話(M)和家庭電話(H),因此,關(guān)系r不屬于第一范式??刹捎靡韵路椒▽規(guī)范化成第一范式:學(xué)號(hào)姓名移動(dòng)電話家庭電話202113871633李凌15912312321020-37648277202113871634章一范式【例6.17】設(shè)有以下關(guān)系r,請(qǐng)問(wèn)r是否屬于第一范式?學(xué)號(hào)姓名電話202113871633李M)H)202113871634章M)【解答】由于在關(guān)系r中,電話屬性可進(jìn)一步劃分為移動(dòng)電話(M)和家庭電話(H),因此,關(guān)系r不屬于第一范式??刹捎靡韵路椒▽規(guī)范化成第一范式:學(xué)號(hào)姓名電話電話類型202113871633李動(dòng)電話202113871633李庭電話202113871634章動(dòng)電話第一范式【例6.17】設(shè)有以下關(guān)系r,請(qǐng)問(wèn)r是否屬于第一范式?學(xué)號(hào)姓名電話202113871633李M)H)202113871634章M)【解答】由于在關(guān)系r中,電話屬性可進(jìn)一步劃分為移動(dòng)電話(M)和家庭電話(H),因此,關(guān)系r不屬于第一范式??刹捎靡韵路椒▽規(guī)范化成第一范式:學(xué)號(hào)姓名電話202113871633李凌15912312321202113871634章二范式對(duì)于函數(shù)依賴X→Y,如果存在X的真子集X’,使得X’→Y也成立,則稱Y部分依賴于X。對(duì)于函數(shù)依賴X→Y,如果X的任一真子集X’,都沒(méi)有X’→Y成立,則稱Y完全依賴于X。如果關(guān)系模式R為1NF,并且R中的每一個(gè)非主屬性都完全依賴于R的某個(gè)候選關(guān)鍵字,則稱R屬于第二范式,簡(jiǎn)記為2NF。

第二范式【例6.18】設(shè)有關(guān)系模式R(A,B,C)及其上面的函數(shù)依賴集F={A→B,B→A,C→A},試分析R是否屬于第二范式?!窘獯稹恳?yàn)镃→A,A→B,根據(jù)Armstrong公理的傳遞律有C→B,所以有C→ABC,則C是主鍵,且A和B都完全依賴于C,因此R屬于第二范式。

將非2NF的關(guān)系模式分解為滿足2NF的關(guān)系模式集(1)用主屬性構(gòu)成的屬性集的每一個(gè)子集作為主鍵構(gòu)成一個(gè)關(guān)系模式。(2)把依賴于這些主鍵的屬性加到對(duì)應(yīng)的關(guān)系模式中。(3)去掉只有主鍵構(gòu)成的關(guān)系模式。

第二范式【例6.19】設(shè)有關(guān)系模式R(學(xué)號(hào),學(xué)生姓名,課程號(hào),課程名,成績(jī),任課教師),試分析R是否屬于第二范式。如果R不屬于第二范式,請(qǐng)將R分解成滿足第二范式的關(guān)系模式集?!窘獯稹筷P(guān)系模式R中存在以下函數(shù)依賴:學(xué)號(hào)→學(xué)生姓名、課程號(hào)→課程名、課程號(hào)→任課教師、(學(xué)號(hào),課程號(hào))→成績(jī),因此,關(guān)系模式R的主鍵是(學(xué)號(hào),課程號(hào))。而學(xué)生姓名、課程名、任課教師等屬性部分依賴于該主鍵,因此關(guān)系模式R不屬于第二范式。

第二范式【例6.19】設(shè)有關(guān)系模式R(學(xué)號(hào),學(xué)生姓名,課程號(hào),課程名,成績(jī),任課教師),試分析R是否屬于第二范式。如果R不屬于第二范式,請(qǐng)將R分解成滿足第二范式的關(guān)系模式集。【解答(續(xù))】將R分解成滿足第二范式的關(guān)系模式集,過(guò)程如下:

R1(學(xué)號(hào),學(xué)生姓名)R2(課程號(hào),課程名,任課教師)R3(學(xué)號(hào),課程號(hào),成績(jī))R1(學(xué)號(hào))R2(課程號(hào))

R3(學(xué)號(hào),課程號(hào))R第三范式如果有函數(shù)依賴X→Y,Y→Z成立,且Y→X不成立,Z不是Y的子集,則稱Y傳遞依賴于X。如果關(guān)系模式R為2NF,并且R中的每一個(gè)非主屬性都不傳遞依賴于R的某個(gè)候選關(guān)鍵字,則稱R屬于第三范式,簡(jiǎn)記為3NF。

第三范式

【例6.20】設(shè)有關(guān)系模式R(X,Y,Z)及其上面的函數(shù)依賴集F={Y→Z,XZ→Y},試分析下列關(guān)系模式R是否屬于第三范式?!窘獯稹坑蒟Z→Y可知XZ是主鍵,R中不存在部分依賴和傳遞依賴,因此,R屬于第三范式。第三范式

【例6.21】設(shè)有關(guān)系模式R(學(xué)號(hào),學(xué)生姓名,課程號(hào),課程名,成績(jī),任課教師,教師所屬學(xué)院),試分析R是否屬于第三范式。如果R不屬于第三范式,請(qǐng)將R分解成滿足第三范式的關(guān)系模式集。【解答】R中存在以下函數(shù)依賴:學(xué)號(hào)→學(xué)生姓名、課程號(hào)→課程名、課程號(hào)→任課教師、任課教師→教師所屬學(xué)院、(學(xué)號(hào),課程號(hào))→成績(jī),因此,R的主鍵是(學(xué)號(hào),課程號(hào))。而學(xué)生姓名、課程名、任課教師等屬性部分依賴于該主鍵,因此R不屬于第二范式,也不屬于第三范式。第三范式

【例6.21】設(shè)有關(guān)系模式R(學(xué)號(hào),學(xué)生姓名,課程號(hào),課程名,成績(jī),任課教師,教師所屬學(xué)院),試分析R是否屬于第三范式。如果R不屬于第三范式,請(qǐng)將R分解成滿足第三范式的關(guān)系模式集?!窘獯穑ɡm(xù)1)】R1(學(xué)號(hào),學(xué)生姓名)2NFR2(課程號(hào),課程名,任課教師,教師所屬學(xué)院)2NFR3(學(xué)號(hào),課程號(hào),成績(jī))2NFRR1(學(xué)號(hào),學(xué)生姓名)3NFR2(課程號(hào),課程名,任課教師,教師所屬學(xué)院)2NFR3(學(xué)號(hào),課程號(hào),成績(jī))3NF第三范式

【例6.21】設(shè)有關(guān)系模式R(學(xué)號(hào),學(xué)生姓名,課程號(hào),課程名,成績(jī),任課教師,教師所屬學(xué)院),試分析R是否屬于第三范式。如果R不屬于第三范式,請(qǐng)將R分解成滿足第三范式的關(guān)系模式集?!窘獯穑ɡm(xù)2)】RR5(任課教師,教師所屬學(xué)院)R4(課程號(hào),課程名,任課教師)3NF3NF

無(wú)損連接并保持函數(shù)依賴地把關(guān)系模式R分解成3NF關(guān)系模式集

【例6.22】設(shè)有關(guān)系模式R(A,B,C,D)及其函數(shù)依賴集F={A→B,C→D},試分析R是否屬于第三范式。如果R不屬于第三范式,請(qǐng)將R分解為無(wú)損連接和保持函數(shù)依賴的滿足3NF的關(guān)系模式集?!窘獯稹拷?jīng)分析可得,R的主鍵是AC。B和D對(duì)主鍵是部分依賴,因此R不屬于3NF。將R分解過(guò)程如下:(1)根據(jù)最小函數(shù)依賴集的定義,可知F就是一個(gè)最小函數(shù)依賴集。(2)沒(méi)有一個(gè)函數(shù)依賴的左右邊相加等于關(guān)系模式R的所有屬性,因此,R需要分解。(3)對(duì)于函數(shù)依賴A→B,構(gòu)建一個(gè)關(guān)系模式R1(A,B);對(duì)于函數(shù)依賴C→D,構(gòu)建一個(gè)關(guān)系模式R2(C,D)。(4)R的唯一候選鍵是AC,而R1和R2都不包含AC,因此需要單獨(dú)構(gòu)建一個(gè)關(guān)系模式R3(A,C)。(5)分解結(jié)束,得到一個(gè)無(wú)損連接和保持函數(shù)依賴的滿足3NF的關(guān)系模式集{R1(A,B),R2(C,D),R3(A,C)}。無(wú)損連接并保持函數(shù)依賴地把關(guān)系模式R分解成3NF關(guān)系模式集

【例6.23】設(shè)有關(guān)系模式R(W,X,Y,Z)及其上面的函數(shù)依賴集F={W→XY,Y→Z,XZ→Y,X→Y},請(qǐng)將R分解為無(wú)損連接和保持函數(shù)依賴的滿足3NF的關(guān)系模式集。【解答】(1)根據(jù)最小函數(shù)依賴集的定義,可知F不是一個(gè)最小函數(shù)依賴集。因此,首先求F的最小函數(shù)依賴集Fmin:把F中右邊包含多個(gè)屬性的函數(shù)依賴分解為右邊只包含一個(gè)屬性的函數(shù)依賴,得到與F等價(jià)的G,G={W→X,W→Y,Y→Z,XZ→Y,X→Y}。刪除G中冗余的函數(shù)依賴:由于X→Y,根據(jù)Armstrong公理的增廣律,XZ→YZ成立,可把XZ→Y刪除,得到與G等價(jià)的函數(shù)依賴集H,H={W→X,W→Y,Y→Z,X→Y}。H中各個(gè)函數(shù)依賴的左部不存在冗余屬性,因此,H即為Fmin。無(wú)損連接并保持函數(shù)依賴地把關(guān)系模式R分解成3NF關(guān)系模式集

【例6.23】設(shè)有關(guān)系模式R(W,X,Y,Z)及其上面的函數(shù)依賴集F={W→XY,Y→Z,XZ→Y,X→Y},請(qǐng)將R分解為無(wú)損連接和保持函數(shù)依賴的滿足3NF的關(guān)系模式集。【解答(續(xù))】(2)沒(méi)有一個(gè)函數(shù)依賴的左右邊相加等于關(guān)系模式R的所有屬性,因此,R需要分解。(3)對(duì)于W→X,構(gòu)建R1(W,X);對(duì)于W→Y,構(gòu)建R2(W,Y);由于W→X和W→Y的左部相等,因此把R1和R2合并得到R3(W,X,Y)。對(duì)于Y→Z和X→Y,分別構(gòu)建R4(Y,Z)和R5(X,Y)。(4)R的唯一候選鍵是W,R3中包含W,因此不需要單獨(dú)構(gòu)建一個(gè)只包含W的關(guān)系模式。(5)分解結(jié)束,得到一個(gè)無(wú)損連接和保持函數(shù)依賴的滿足3NF的關(guān)系模式集{R3(W,X,Y),R4(Y,Z),R5(X,Y)}。無(wú)損連接并保持函數(shù)依賴地把關(guān)系模式R分解成3NF關(guān)系模式集Boyce-Codd范式如果關(guān)系模式R為1NF,并且R中的每一個(gè)函數(shù)依賴X→Y(Y?X),必有X是R的超鍵,則稱R屬于Boyce-Codd范式,簡(jiǎn)記為BCNF。BCNF要求滿足的條件比3NF所要求的更高。如果關(guān)系模式R是BCNF的,那么R必定是3NF,反之,則不一定成立。

Boyce-Codd范式

【例6.24】設(shè)有關(guān)系模式R(X,Y,Z)及其上面的函數(shù)依賴集F={Y→Z,XZ→Y},試分析下列關(guān)系模式R是否屬于BCNF?!窘獯稹坑蒟Z→Y可知XZ是主鍵,因此,對(duì)于函數(shù)依賴Y→Z,其左邊不是R的超鍵,因此R不屬于BCNF。

輸入:關(guān)系模式R(U)及在其上面的函數(shù)依賴集F輸出:R的一個(gè)分解ρ={R1,R2,…,Rn},且ρ是無(wú)損連接的分解步驟如下:(1)初始化置ρ={R}。(2)如果ρ中所有關(guān)系模式都是BCNF,轉(zhuǎn)(4)。(3)如果ρ中有一個(gè)關(guān)系模式S不是BCNF,那么在S中必能找到一個(gè)函數(shù)依賴X→A,X不是S的超鍵且A?X,把S分解為S1和S2,S1=XA,S2=S-A。轉(zhuǎn)(2)。(4)分解結(jié)束,輸出ρ。值得注意的是,在步驟(3)中,若存在多個(gè)函數(shù)依賴X→A,X不是S的超鍵且A?X,對(duì)這些函數(shù)依賴處理的順序不一樣,得到的BCNF關(guān)系模式集有可能不一樣。把關(guān)系模式R無(wú)損連接地分解成BCNF關(guān)系模式集

【例6.25】設(shè)有關(guān)系模式R(A,B,C,D,E)及其上面的函數(shù)依賴集F={ABC→DE,BC→D,D→E},試分析下列關(guān)系模式R是否屬于BCNF。如果R不屬于BCNF,請(qǐng)將R無(wú)損連接地分解為滿足BCNF的關(guān)系模式集?!窘獯?】R的主鍵是(A,B,C),因?yàn)锽C→D和D→E的左邊都不是R的超鍵,所以R不屬于BCNF。把關(guān)系模式R無(wú)損連接地分解成BCNF關(guān)系模式集R(A,B,C,D,E)F={ABC→DE,BC→D,D→E}R1(D,E)F1={D→E}R2(A,B,C,D)F2={ABC→D,BC→D}D→E,D不是鍵R21(B,C,D)F21={BC→D}R22(A,B,C)F22=??BC→D,BC不是鍵BCNFBCNFBCNF

【例6.25】設(shè)有關(guān)系模式R(A,B,C,D,E)及其上面的函數(shù)依賴集F={ABC→DE,BC→D,D→E},試分析下列關(guān)系模式R是否屬于BCNF。如果R不屬于BCNF,請(qǐng)將R無(wú)損連接地分解為滿足BCNF的關(guān)系模式集?!窘獯?】R的主鍵是(A,B,C),因?yàn)锽C→D和D→E的左邊都不是R的超鍵,所以R不屬于BCNF。把關(guān)系模式R無(wú)損連接地分解成BCNF關(guān)系模式集R(A,B,C,D,E)F={ABC→DE,BC→D,D→E}R1(B,C,D)F1={BC→D}R2(A,B,C,E)F2={ABC→E,BC→E}BC→D,BC不是鍵BCNF由BC→D和D→E得BC→ER21(B,C,E)F21={BC→E}R22(A,B,C)F22=??BC→E,BC不是鍵BCNFBCNF各范式間的聯(lián)系Notice:下面一種比上面一種要求更嚴(yán)格。要符合某一種范式必須也滿足它上邊的所有范式。

規(guī)范化的實(shí)質(zhì)根據(jù)語(yǔ)義確定參與數(shù)據(jù)庫(kù)的各個(gè)屬性確定哪些是主屬性,哪些是非主屬性確定所有的候選關(guān)鍵字并且選定主鍵找出屬性間的函數(shù)依賴和多值依賴關(guān)系模式分解原則設(shè)計(jì)出來(lái)的關(guān)系模式至少要達(dá)到3NF的要求無(wú)損連接保持函數(shù)依賴分解出來(lái)的關(guān)系模式個(gè)數(shù)和屬性總數(shù)越少越好

本章小結(jié)函數(shù)依賴Armstrong公理最小函數(shù)依賴集無(wú)損連接的分解保持函數(shù)依賴的分解1NF、2NF、3NF、BCNF感謝觀看!DatabaseTechnology&Applications數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用SQL概述SQL的功能SQL功能動(dòng)詞數(shù)據(jù)定義CREATEDROPALTER數(shù)據(jù)更新INSERTUPDATEDELETE數(shù)據(jù)查詢SELECT

數(shù)據(jù)控制GRANTREVOKE

SQL(StructuredQueryLanguage)是1974年由IBM公司的RayBoyce和DonChamberlin依據(jù)Codd關(guān)系數(shù)據(jù)庫(kù)的12條準(zhǔn)則的數(shù)學(xué)定義提出來(lái)的。SQL的特點(diǎn)一體化非過(guò)程化面向集合一種語(yǔ)法兩種使用方式簡(jiǎn)潔易學(xué)關(guān)系數(shù)據(jù)庫(kù)的實(shí)現(xiàn)(以openGauss為例)連接數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù)創(chuàng)建表結(jié)構(gòu)建立表間關(guān)系向表中輸入數(shù)據(jù)連接openGauss數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù)創(chuàng)建表結(jié)構(gòu)openGauss常用的數(shù)據(jù)類型及其使用方法數(shù)據(jù)類型使用說(shuō)明大小數(shù)值可用來(lái)進(jìn)行算術(shù)計(jì)算的數(shù)字?jǐn)?shù)據(jù)。設(shè)置“字段大小”屬性定義一個(gè)特定的數(shù)字類型。其中NUMERIC、DECIMAL是任意精度類型。1、2、4或8個(gè)字節(jié),與“字段大小”屬性定義有關(guān)。例如NUMERIC[(p[,s])],DECIMAL[(p[,s])],p為總位數(shù),s為小數(shù)位數(shù)日期/時(shí)間用于存儲(chǔ)日期和時(shí)間值4、8、12、16個(gè)字節(jié)字符字符串類型指CHAR、CHARACTER、NCHAR、VARCHAR、CHARACTERVARYING、VARCHAR2、NVARCHAR2、CLOB和TEXT。10MB~1GB-8203字節(jié)布爾即true或false1字節(jié)“學(xué)生”表結(jié)構(gòu)“課程”表結(jié)構(gòu)“選修”表結(jié)構(gòu)建立表間關(guān)系建立表間關(guān)系向表中輸入數(shù)據(jù)——手動(dòng)輸入數(shù)據(jù)向表中輸入數(shù)據(jù)——從Excel表批量導(dǎo)入數(shù)據(jù)向表中輸入數(shù)據(jù)——從Excel表批量導(dǎo)入數(shù)據(jù)向表中輸入數(shù)據(jù)——從Excel表批量導(dǎo)入數(shù)據(jù)數(shù)據(jù)定義SQL的數(shù)據(jù)對(duì)象創(chuàng)建數(shù)據(jù)對(duì)象定義撤消更改數(shù)據(jù)庫(kù)CREATEDATABASEDROPDATABASEALTERDATABASE基本表CREATETABLEDROPTABLEALTERTABLE視圖CREATEVIEWDROPVIEW

索引CREATEINDEXDROPINDEX

結(jié)構(gòu)定義CREATECREATEDATABASE<數(shù)據(jù)庫(kù)模式名>CREATETABLE<表名>(<列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件][,<列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件]]……[,<表級(jí)完整性約束條件>])其中[]內(nèi)的內(nèi)容是可選項(xiàng)。結(jié)構(gòu)定義CREATE【例7.1】在Navicat中用SQL語(yǔ)句來(lái)實(shí)現(xiàn)7.1.2節(jié)中通過(guò)圖形化界面創(chuàng)建的數(shù)據(jù)庫(kù)和表。

用CREATEDATABASE命令創(chuàng)建“選課管理數(shù)據(jù)庫(kù)”(EMS):結(jié)構(gòu)定義CREATE【例7.1】在Navicat中用SQL語(yǔ)句來(lái)實(shí)現(xiàn)7.1.2節(jié)中通過(guò)圖形化界面創(chuàng)建的數(shù)據(jù)庫(kù)和表。CREATETABLEpublic.課程(

課程號(hào)varchar(35)NOTNULL,

課程名varchar(20)NOTNULL,

學(xué)時(shí)int2NOTNULL,

學(xué)分float4NOTNULL,CONSTRAINTCourse_pkeyPRIMARYKEY(課程號(hào)));結(jié)構(gòu)定義CREATE【例7.1】在Navicat中用SQL語(yǔ)句來(lái)實(shí)現(xiàn)7.1.2節(jié)中通過(guò)圖形化界面創(chuàng)建的數(shù)據(jù)庫(kù)和表。CREATETABLEpublic.學(xué)生(

身份證號(hào)varchar(18)NOTNULL,

學(xué)號(hào)varchar(12)NOTNULL,

姓名varchar(10)NOTNULL,

性別varchar(1)NOTNULLDEFAULT'男'::charactervarying,

班級(jí)varchar(20),

生日dateNOTNULL,CONSTRAINT"學(xué)生_pkey"PRIMARYKEY(學(xué)號(hào)),CONSTRAINT"學(xué)生_性別_check"CHECK(性別='男’or性別='女'));結(jié)構(gòu)定義CREATE【例7.1】在Navicat中用SQL語(yǔ)句來(lái)實(shí)現(xiàn)7.1.2節(jié)中通過(guò)圖形化界面創(chuàng)建的數(shù)據(jù)庫(kù)和表。CREATETABLEpublic.選修(

課程號(hào)varchar(35)NOTNULL,

學(xué)號(hào)varchar(12)NOTNULL,

成績(jī)int4,CONSTRAINT選修_pkeyPRIMARYKEY(課程號(hào),學(xué)號(hào)),CONSTRAINTFK_學(xué)號(hào)FOREIGNKEY(學(xué)號(hào))REFERENCESpublic.學(xué)生(學(xué)號(hào))ONDELETENOACTIONONUPDATENOACTION,CONSTRAINTFK_課程號(hào)FOREIGNKEY(課程號(hào))REFERENCESpublic.課程(課程號(hào))ONDELETENOACTIONONUPDATENOACTION);結(jié)構(gòu)更新ALTER增加屬性列ALTERTABLE<基本表名>ADD<新列名><數(shù)據(jù)類型>[完整性約束條件]-<表名>是要更新的基本表名稱-ADD子句用于增加新列和新的完整性約束條件【例7.2】在“學(xué)生”表中添加一個(gè)新的地址屬性ADDRESS。ALTERTABLE學(xué)生ADDADDRESSVARCHAR(30);結(jié)構(gòu)更新ALTER刪除屬性列ALTERTABLE<基本表名>DROP<屬性列名>[CASCADE|RESTRAIN]-CASCADE表示在基本表刪除某屬性列時(shí),所有引用到該屬性列的視圖和約束也要一起自動(dòng)刪除-RESTRAIN表示在沒(méi)有視圖或約束引用該屬性列時(shí),才可以在基本表中刪除該列,否則就拒絕刪除操作【例7.3】在“學(xué)生”表中刪除屬性列ADDRESS。ALTERTABLE學(xué)生DROPADDRESSCASCADE;結(jié)構(gòu)更新ALTER修改屬性列ALTERTABLE<基本表名>MODIFY<屬性列名><類型>【例7.4】在“學(xué)生”表中將學(xué)號(hào)的長(zhǎng)度修改為“12”。ALTERTABLE學(xué)生MODIFY學(xué)號(hào)CHAR(12);結(jié)構(gòu)更新ALTER補(bǔ)充定義主鍵ALTERTABLE<表名>ADDPRIMARYKEY(<列名表>)需要指出,被定義為主鍵的屬性列應(yīng)當(dāng)是非空和滿足唯一性要求的。結(jié)構(gòu)更新ALTER刪除主鍵ALTERTABLE<表名>DROPPRIMARYKEY(<列名表>)或者ALTERTABLE<表名>DROPCONSTRAINT<主鍵約束名>【例7.5】刪除“學(xué)生”表中主鍵“學(xué)號(hào)”的SQL語(yǔ)句如下。ALTERTABLE學(xué)生DROPCONSTRAINT學(xué)生_pkeyCASCADE;結(jié)構(gòu)更新ALTER【例7.6】在“學(xué)生”表中添加主鍵“學(xué)號(hào)”以及在“選修”表中添加外鍵的SQL語(yǔ)句如下。ALTERTABLE學(xué)生ADDPRIMARYKEY(學(xué)號(hào));ALTERTABLE選修ADDCONSTRAINTFK_學(xué)號(hào)FOREIGNKEY(學(xué)號(hào))REFERENCESpublic.學(xué)生(學(xué)號(hào))ONDELETENOACTIONONUPDATENOACTION;結(jié)構(gòu)撤銷DROP【例7.7】撤銷“學(xué)生”表,但要求只有在沒(méi)有視圖或約束引用“學(xué)生”表的屬性列時(shí)才能撤銷,否則拒絕撤銷。DROPTABLE學(xué)生RESTRICT;DROPDATABASE<數(shù)據(jù)庫(kù)名>DROPTABLE<基本表名>[CASCADE|RESTRICT]-RESTRICT表示沒(méi)有視圖或約束引用“學(xué)生”表的屬性列時(shí)才能撤銷,否則拒絕撤銷,意味著要先刪除視圖或相關(guān)約束,再來(lái)刪除該表。-CASCADE表示刪除表的時(shí)候會(huì)把相關(guān)的視圖等一并刪除。數(shù)據(jù)查詢SELECT基本語(yǔ)法SELECT[ALL|DISTINCT]<屬性名>[,<屬性名>]…FROM<基本表名或視圖名>[,<基本表名或視圖名>]…[WHERE<邏輯條件式>][GROUPBY<屬性名1>[HAVING<邏輯表達(dá)式>]][ORDERBY<屬性名2>[ASC|DESC]]單表查詢【例7.8】在“選課管理數(shù)據(jù)庫(kù)”中查詢“課程”表的全部記錄情況。SELECT*FROM課程;單表查詢【例7.9】在“學(xué)生”表中查詢學(xué)生的學(xué)號(hào)、姓名和性別。SELECT學(xué)號(hào),姓名,性別FROM學(xué)生;單表查詢【例7.10】(查詢指定屬性列)查詢所有選修了課程的學(xué)生的學(xué)號(hào)。SELECT學(xué)號(hào)FROM選修;說(shuō)明:該查詢的結(jié)果中會(huì)有重復(fù)的學(xué)號(hào)。SELECT后加DISTINCT即可去掉重復(fù)學(xué)號(hào):SELECTDISTINCT學(xué)號(hào)FROM選修;單表查詢【例7.11】查詢?nèi)w學(xué)生的分?jǐn)?shù)都增加10分后的“選修”表。SELECT學(xué)號(hào),成績(jī)+10FROM選修;具條件的屬性列查詢運(yùn)算符含義集合成員運(yùn)算IN,NOTIN在集合中,不在集合中字符匹配運(yùn)算LIKE與-和%進(jìn)行單個(gè)、多個(gè)字符匹配空值運(yùn)算ISNULL,ISNOTNULL為空,不能為空比較運(yùn)算>,>=,<,,=<,=,<>大于,大于等于,小于,小于等于,等于,不等于邏輯運(yùn)算AND,OR,NOT與,或,非,具條件的屬性列查詢【例7.12】在“選修”表中查找不及格的學(xué)生的學(xué)號(hào)。SELECT學(xué)號(hào)FROM選修WHERE成績(jī)<60;具條件的屬性列查詢【例7.13】在“選修”表中查找課程號(hào)為“1026”的不及格的學(xué)生學(xué)號(hào)。SELECT學(xué)號(hào)FROM選修WHERE成績(jī)<60AND課程號(hào)='1026';具條件的屬性列查詢【例7.14】在“選修”表中查找成績(jī)?cè)赱60,80]這個(gè)區(qū)間內(nèi)的記錄。SELECT*FROM選修WHERE成績(jī)BETWEEN60AND80;具條件的屬性列查詢【例7.15】在“選修”表中查找成績(jī)?yōu)閧60,70,80}的學(xué)生。SELECT*FROM選修WHERE成績(jī)IN(60,70,80);查詢通配符通配符含

義%包含0個(gè)或多個(gè)字符_包含1個(gè)字符[]指定范圍,如[a-d]代表a、b、c和d[^]不屬于指定的范圍,如[^a-d]代表排除了a、b、c和d以外的其他字符查詢通配符【例7.16】顯示“學(xué)生”表中姓“馬”的同學(xué)的基本信息。SELECT*FROM學(xué)生WHERE姓名LIKE'馬%';查詢通配符【例7.17】若要查找的馬姓同學(xué)的姓名只有兩個(gè)字。SELECT*FROM學(xué)生WHERE姓名LIKE'馬_';空值查詢【例7.18】將“選修”表中有成績(jī)的記錄顯示出來(lái)。SELECT*FROM選修WHERE成績(jī)ISNOTNULL;排序查詢【例7.19】在“學(xué)生”表中查詢學(xué)生的基本情況(包括學(xué)生的學(xué)號(hào)、姓名和性別),結(jié)果按照學(xué)號(hào)的降序排列。SELECT學(xué)號(hào),姓名,性別FROM學(xué)生ORDERBY學(xué)號(hào)DESC;若將DESC改成ASC或者不寫,則查詢結(jié)果會(huì)根據(jù)ORDERBY后面的字段升序排列。排序查詢【例7.20】在“學(xué)生”表中查詢學(xué)生的基本情況,并按性別的升序顯示結(jié)果;對(duì)于性別相同的記錄,再按學(xué)號(hào)的降序進(jìn)行排列。SELECT*FROM學(xué)生ORDERBY性別ASC,學(xué)號(hào)DESC;排序查詢【例7.21】在“選修”表中查找課程號(hào)為“1026”的成績(jī)最高的前三名學(xué)生的學(xué)號(hào)。SELECT學(xué)號(hào)FROM選修WHERE課程號(hào)='1026'ORDERBY成績(jī)DESCLIMIT3;連接查詢內(nèi)連接(INNERJOIN)外連接(OUTERJOIN)連接(LEFTJOIN)右連接(RIGHTJOIN)全連接(FULLJOIN)內(nèi)連接基本語(yǔ)法SELECT<屬性或表達(dá)式列表>FROM<表名>[INNER]JOIN<表名>ON<連接條件>/USING<字段1>[WHERE<限定條件>]只有滿足給出的連接條件時(shí),相應(yīng)結(jié)果才會(huì)出現(xiàn)在結(jié)果關(guān)系表中。內(nèi)連接【例7.22】查詢選修了課程號(hào)為“1025”課程的所有學(xué)生學(xué)號(hào)與姓名。SELECT學(xué)生.學(xué)號(hào),姓名FROM學(xué)生JOIN選修ON學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào)WHERE課程號(hào)=’1025’;SELECT學(xué)生.學(xué)號(hào),姓名FROM學(xué)生JOIN選修USING(學(xué)號(hào))WHERE課程號(hào)='1025';SELECT學(xué)生.學(xué)號(hào),姓名FROM學(xué)生,選修WHERE學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào)AND課程號(hào)='1025';內(nèi)連接【例7.23】查詢修讀課程名為“數(shù)據(jù)庫(kù)”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生JOIN選修ON學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào)JOIN課程ON選修.課程號(hào)=課程.課程號(hào)WHERE課程名='數(shù)據(jù)庫(kù)';內(nèi)連接【例7.24】查詢至少修讀了學(xué)生學(xué)號(hào)為“202101231234”所修讀的一門課的學(xué)生學(xué)號(hào)。SELECT選修1.學(xué)號(hào)FROM選修選修1,選修選修2WHERE選修1.課程號(hào)=選修2.課程號(hào)AND選修2.學(xué)號(hào)=‘202101231234’;外連接【例7.25】查詢所有學(xué)生的基本信息和選課情況。SELECT學(xué)號(hào),姓名,生日,班級(jí),身份證號(hào),課程號(hào),成績(jī)FROM學(xué)生JOIN選修ON學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào);學(xué)生李敏沒(méi)有選修任何課程,由于在“選修”表沒(méi)有李敏的相應(yīng)元組,所以查詢結(jié)果中不會(huì)出現(xiàn)她的學(xué)號(hào)。外連接基本語(yǔ)法SELECT<屬性或表達(dá)式列表>FROM<表名>LEFT|RIGHT|FULL[OUTER]JOIN<表名>ON<連接條件>/USING<字段1>[WHERE<限定條件>]外連接【例7.26】查詢所有學(xué)生的基本信息和選課情況。SELECT學(xué)生.學(xué)號(hào),姓名,班級(jí),身份證號(hào),課程號(hào),成績(jī)FROM學(xué)生LEFTJOIN選修ON學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào);外連接【例7.27】查詢所有課程的基本信息和被選修的情況,包括沒(méi)有人選修的也要列出。SELECT課程.課程號(hào),課程名,學(xué)時(shí),學(xué)分,成績(jī)FROM選修RIGHTJOIN課程ON學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào);嵌套查詢作為WHERE子句中的邏輯表達(dá)式,嵌套子查詢有三種形式:字段[NOT]IN子查詢字段θSOME/ANY/ALL子查詢[NOT]EXISTS(子查詢)嵌套查詢【例7.28】查詢修讀課程號(hào)為“1025”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生WHERE學(xué)號(hào)IN (SELECT學(xué)號(hào) FROM選修 WHERE課程號(hào)=‘1025’);嵌套查詢【例7.29】查詢沒(méi)有修讀課程號(hào)為“1025”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生WHERE學(xué)號(hào)NOTIN (SELECT學(xué)號(hào) FROM選修 WHERE課程號(hào)=‘1025’);嵌套查詢【例7.30】查詢修讀課程名為“數(shù)據(jù)庫(kù)”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生 WHERE學(xué)號(hào)IN(SELECT學(xué)號(hào)FROM選修

WHERE課程號(hào)IN (SELECT課程號(hào)FROM課程 WHERE課程名=‘?dāng)?shù)據(jù)庫(kù)’));嵌套查詢【例7.31】查詢修讀課程號(hào)為“1025”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生WHERE學(xué)號(hào)=SOME (SELECT學(xué)號(hào) FROM選修 WHERE課程號(hào)=‘1025’);嵌套查詢【例7.32】查詢沒(méi)有修讀課程號(hào)為“1025”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生WHERE學(xué)號(hào)<>ALL (SELECT學(xué)號(hào) FROM選修 WHERE課程號(hào)=‘1025’);嵌套查詢【例7.33】查詢課程號(hào)為“1025”的最高分的學(xué)生姓名。SELECT姓名FROM學(xué)生INNERJOIN選修USING(學(xué)號(hào))WHERE課程號(hào)=‘1025’AND成績(jī)>=ALL (SELECT成績(jī)

FROM選修

WHERE課程號(hào)=‘1025’AND成績(jī)ISNOTNULL);嵌套查詢【例7.34】查詢學(xué)生“賀易”本期選修課程號(hào)“1025”的成績(jī)。SELECT成績(jī)FROM選修WHERE課程號(hào)=‘1025’AND學(xué)號(hào)=(SELECT學(xué)號(hào) FROM學(xué)生 WHERE姓名=‘賀易’);嵌套查詢【例7.35】查詢修讀課程號(hào)為“1025”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生WHEREEXISTS (SELECT* FROM選修 WHERE課程號(hào)=’1025’AND學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào));嵌套查詢【例7.36】查詢沒(méi)有修讀課程號(hào)為“1025”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生WHERENOTEXISTS (SELECT* FROM選修 WHERE課程號(hào)=‘1025’AND學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào));嵌套查詢【例7.37】查詢課程號(hào)為“1025”的最高分的學(xué)生姓名。SELECT姓名FROM學(xué)生INNERJOIN選修選修1ON學(xué)生.學(xué)號(hào)=選修1.學(xué)號(hào)WHERE課程號(hào)=‘1025’ANDNOTEXISTS

(SELECT* FROM選修選修2WHERE課程號(hào)=‘1025’AND選修1.成績(jī)<選修2.成績(jī));嵌套查詢【例7.38】查詢學(xué)生“賀易”選修課程號(hào)“1025”的成績(jī)。SELECT成績(jī)FROM選修WHERE課程號(hào)=‘1025’ANDEXISTS

(SELECT* FROM學(xué)生 WHERE姓名=‘賀易’AND選修.學(xué)號(hào)=學(xué)生.學(xué)號(hào));聚合函數(shù)COUNT函數(shù)ICOUNT([DISTINCT|ALL]*)統(tǒng)計(jì)關(guān)系中元組個(gè)數(shù)。COUNT函數(shù)IICOUNT([DISTINCT|ALL]<列名>)統(tǒng)計(jì)關(guān)系中給定列中屬性值個(gè)數(shù)。SUM函數(shù)SUM([DISTINCT|ALL]<列名>)計(jì)算關(guān)系中數(shù)值型屬性值總和。AVG函數(shù)AVG([DISTINCT|ALL]<列名>)計(jì)算關(guān)系中數(shù)值型屬性值平均值。MAX函數(shù)MAX([DISTINCT|ALL]<列名>)計(jì)算關(guān)系中給定屬性列中數(shù)值型屬性值的最大者。MIN函數(shù)MIN([DISTINCT|ALL]<列名>)計(jì)算關(guān)系中給定屬性列中數(shù)值型屬性值的最小者。聚合函數(shù)【例7.39】查詢?nèi)w學(xué)生人數(shù)。SELECTCOUNT(*)FROM學(xué)生;聚合函數(shù)【例7.40】查詢學(xué)生張怡修讀的課程數(shù)。SELECTCOUNT(*)FROM學(xué)生INNERJOIN選修USING(學(xué)號(hào))WHERE姓名=’張怡’;聚合函數(shù)【例7.41】查詢學(xué)號(hào)為“202101231234”的學(xué)生所修讀課程的平均成績(jī)。SELECTAVG(成績(jī))FROM選修WHERE學(xué)號(hào)=‘202101231234’;聚合函數(shù)【例7.42】查詢可供學(xué)生選修的課程門數(shù)。SELECTCOUNT(*)FROM課程;聚合函數(shù)【例7.43】查詢已有學(xué)生選修的課程門數(shù)。SELECTCOUNT(DISTINCT課程號(hào))FROM選修;分組基本語(yǔ)法SELECT[ALL|DISTINCT]<屬性名>[,<屬性名>]…FROM<基本表名或視圖名>[,<基本表名或視圖名>]…[WHERE<邏輯條件式>][GROUPBY<屬性名1>[HAVING<邏輯表達(dá)式>]][ORDERBY<屬性名2>[ASC|DESC]]分組【例7.44】給出每門課程的平均成績(jī)。SELECT課程號(hào),AVG(成績(jī))FROM選修GROUPBY課程號(hào);分組【例7.45】給出每個(gè)學(xué)生修讀課程的門數(shù):SELECT學(xué)號(hào),COUNT(課程號(hào))FROM選修GROUPBY學(xué)號(hào);分組【例7.46】例7.33選修課程號(hào)為“1025”的最高分的學(xué)生姓名的查詢也可以寫為:SELECT姓名FROM學(xué)生INNERJOIN選修ON學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào)WHERE課程號(hào)=‘1025’AND成績(jī)=SOME

(SELECTMAX(成績(jī)) FROM選修

WHERE課程號(hào)=‘1025’);分組【例7.47】給出有10個(gè)或10個(gè)以上學(xué)生所修讀課程的課程號(hào)和學(xué)生數(shù)。SELECT課程號(hào),COUNT(學(xué)號(hào))FROM選修GROUPBY課程號(hào)HAVINGCOUNT(*)>=10;數(shù)據(jù)更新數(shù)據(jù)更新功能刪除插入修改基本語(yǔ)句DELETEFROM<表名>[WHERE<條件>]INSERTINTO<表名>[屬性列]…VALUES(屬性值1,屬性值2,…)或子查詢UPDATE<表名>SET屬性名=屬性值,…[WHERE<條件>]基本語(yǔ)義刪除元組插入元組修改屬性值數(shù)據(jù)刪除基本語(yǔ)法DELETEFROM<基本表名>WHERE<條件>刪除多個(gè)元組的值【例7.48】刪除學(xué)生“劉玉”的記錄。DELETEFROM學(xué)生WHERE姓名=‘劉玉’;帶子查詢刪除語(yǔ)句【例7.49】刪除21醫(yī)學(xué)院全體學(xué)生的選課記錄。DELETEFROM選修WHERE‘21醫(yī)學(xué)院’=(SELECT班級(jí)

FROM學(xué)生 WHERE學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào));數(shù)據(jù)插入基本語(yǔ)法INSERTINTO<表名>(字段列表)VALUES(值列表)或INSERTINTO<表名>(字段列表)子查詢數(shù)據(jù)插入【例7.50】往“課程”表添加入一條課程號(hào)為“1032”,課程名為“大學(xué)物理”,學(xué)時(shí)為64,學(xué)分為3的記錄。INSERTINTO課程(課程號(hào),課程名,學(xué)時(shí),學(xué)分)VALUES('1032','大學(xué)物理',64,3);或INSERTINTO課程VALUES('1032','大學(xué)物理',64,3);數(shù)據(jù)插入【例7.51】將一個(gè)學(xué)生新記錄(身份證號(hào)學(xué)號(hào)202101231255,姓名:陳靜,性別:女,生日:2001-12-29)插入到“學(xué)生”表中。INSERTINTO學(xué)生(身份證號(hào),學(xué)號(hào),姓名,性別,生日)VALUES(,'202101231255','陳靜','女','2001-12-29');數(shù)據(jù)插入【例7.52】創(chuàng)建一張新表“學(xué)生平均分”,有兩個(gè)字段(學(xué)號(hào),成績(jī)),將每個(gè)學(xué)生選修的平均分放至該表中。CREATETABLE學(xué)生平均分(學(xué)號(hào)varchar(12)NOTNULL,成績(jī)int4);INSERTINTO學(xué)生平均分SELECT學(xué)號(hào),AVG(成績(jī))FROM選修GROUPBY學(xué)號(hào);數(shù)據(jù)修改基本語(yǔ)法UPDATE<基本表名>SET<列名>=表達(dá)式[,<列名>=表達(dá)式]…WHERE<邏輯條件>數(shù)據(jù)修改【例7.53】將“選修”表里所有記錄的成績(jī)字段增加5。UPDATE選修SET成績(jī)=成績(jī)+5;數(shù)據(jù)修改【例7.54】將“課程”表里課程名為“計(jì)算機(jī)基礎(chǔ)”的課程改名為“大學(xué)計(jì)算機(jī)基礎(chǔ)”。UPDATE課程SET課程名='大學(xué)計(jì)算機(jī)基礎(chǔ)'WHERE課程名='計(jì)算機(jī)基礎(chǔ)';視圖管理視圖的作用視圖是一張?zhí)摫?,?shù)據(jù)來(lái)自由定義視圖的查詢所引用的表。對(duì)視圖進(jìn)行數(shù)據(jù)更新時(shí)實(shí)際上是對(duì)基本表進(jìn)行相應(yīng)的更新(一般對(duì)視圖的更新操作是有很多限制條件的)。在openGauss中不支持視圖的更新。SQL視圖管理機(jī)制的意義簡(jiǎn)化用戶操作用戶可以多角度看待同一數(shù)據(jù)提供一定的邏輯獨(dú)立性對(duì)數(shù)據(jù)提供各種角度的安全保護(hù)視圖創(chuàng)建基本語(yǔ)法CREATEVIEW<視圖名>([<列名>[,<列名>]…])AS<子查詢>[WITHCHECKOPTION];//表示用視圖進(jìn)行更新、插入和刪除操作時(shí)要保證更新的元組滿足視圖定義中的謂詞條件。視圖創(chuàng)建【例7.55】創(chuàng)建一個(gè)“21計(jì)算機(jī)學(xué)院”的學(xué)生視圖:CREATEVIEWCS21_SASSELECT*FROM學(xué)生 WHERE班級(jí)=‘21計(jì)算機(jī)學(xué)院’WITHCHECKOPTION;系統(tǒng)會(huì)自動(dòng)檢查或者加上班級(jí)=’21計(jì)算機(jī)學(xué)院’的條件視圖創(chuàng)建【例7.56】定義學(xué)生姓名、修讀的課程名及成績(jī)的視圖。CREATEVIEWS_C_G(學(xué)號(hào),姓名,課程名,成績(jī))ASSELECT學(xué)生.學(xué)號(hào),姓名,課程名,成績(jī)FROM學(xué)生,課程,選修WHERE學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào)AND選修.課程號(hào)=課程.課程號(hào);視圖撤銷DROPVIEW<視圖名>;【例7.57】撤銷已建立的一個(gè)視圖S_C_G。DROPVIEWS_C_G;查詢視圖【例7.58】用例7.55中定義的視圖CS21_S做查詢,查詢計(jì)算機(jī)系中的女學(xué)生。SELECT*FROMCS21_SWHERE性別=’女’;SELECT*FROM學(xué)生WHERE班級(jí)=’21計(jì)算機(jī)學(xué)院’

AND性別=’女’;查詢視圖【例7.59】在S_C_G視圖中查詢成績(jī)?cè)?5分以上的學(xué)生的學(xué)號(hào)、姓名和課程名稱。SELECT學(xué)號(hào),姓名,課程名FROMS_C_GWHERE成績(jī)>=85;查詢視圖【例7.60】查詢21計(jì)算機(jī)學(xué)院所有學(xué)生的選課情況。SELECT*FROMCS21_SINNERJOIN選修USING(學(xué)號(hào));本章小結(jié)SQL的數(shù)據(jù)定義SQL的數(shù)據(jù)查詢SQL的數(shù)據(jù)更新視圖的概念與作用感謝觀看!DatabaseTechnology&Applications數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用數(shù)據(jù)庫(kù)完整性實(shí)施數(shù)據(jù)完整性的必要性正確性(correctness)數(shù)據(jù)語(yǔ)法的正確性如數(shù)值型數(shù)據(jù)中只能含有數(shù)字而不能含有字母有效性(valid)數(shù)據(jù)是否屬于所定義域的有效范圍如年齡不能是負(fù)數(shù),在0到150之間。相容性(consistency)同一事實(shí)的兩個(gè)數(shù)據(jù)應(yīng)當(dāng)一致如數(shù)據(jù)庫(kù)中同時(shí)有年齡和出生年份這兩個(gè)數(shù)據(jù),則年齡應(yīng)該等于當(dāng)前年份-出生年份防止各類錯(cuò)誤數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù)!DBMS完整性控制的功能定義提供完整性約束條件的定義機(jī)制,確定要遵從的數(shù)據(jù)規(guī)則檢查檢查用戶發(fā)出的操作請(qǐng)求是否違背完整性約束條件處理如果發(fā)現(xiàn)用戶操作請(qǐng)求與完整性約束條件不符,需要采取一定的動(dòng)作實(shí)體完整性規(guī)則的定義通過(guò)定義或者修改表結(jié)構(gòu)的時(shí)候定義PRIMARYKEY來(lái)實(shí)現(xiàn)。定義PRIMARYKEY的子句在CREATETABLE命令中的格式為:PRIMARYKEY(<列名序列>);//一個(gè)關(guān)系只能有一個(gè)PRIMARYKEY,鍵值非空且唯一實(shí)體完整性約束控制的實(shí)現(xiàn)【例8.1】新建學(xué)生S表(學(xué)號(hào),姓名,年齡,身份證號(hào)),并定義實(shí)體完整性。CREATETABLES(SNOCHAR(8)PRIMARYKEY,/*在屬性列級(jí)別上定義主鍵*/SNameCHAR(10),Sageint,SecurityNOCHAR(18));實(shí)體完整性約束控制的實(shí)現(xiàn)【例8.1】新建學(xué)生S表(學(xué)號(hào),姓名,年齡,身份證號(hào)),并定義實(shí)體完整性。CREATETABLES(SNOCHAR(8),SNameCHAR(10),Sageint,SecurityNOCHAR(18),PRIMARYKEY(SNO));/*在關(guān)系級(jí)別上定義主鍵*/實(shí)體完整性約束控制的實(shí)現(xiàn)【例8.2】新建課程C表(課程號(hào),課程名,學(xué)分),并定義實(shí)體完整性。CREATETABLEC(CNOCHAR(8),CNameCHAR(10),HourNUMERIC(3),PRIMARYKEY(CNO));/*在關(guān)系級(jí)別上定義主鍵*/實(shí)體完整性約束控制的實(shí)現(xiàn)【例8.3】數(shù)據(jù)插入違反實(shí)體完整性而失敗的例子往S表插入兩條數(shù)據(jù):INSERTINTOSVALUES('S001','小明',19,’200006’);/*插入成功*/INSERTINTOSVALUES('S001','小紅',20,’300456’);/*插入失敗*/INSERTINTOSVALUES('S002','小紅',20,’300456’);/*插入成功*/UPDATESSETSNO='S001'WHERESNAME='小紅'/*更新失敗*/同樣學(xué)號(hào)的記錄已存在同樣學(xué)號(hào)的記錄已存在參照完整性規(guī)則的定義參照完整性(外鍵)定義的子句在CREATETABLE命令中一般格式為:FOREIGNKEY(<列名序列>)REFERENCES關(guān)系名<目標(biāo)關(guān)系名>|(<列名序列>)

[ONDELETE<ACTION>][ONUPDATE<ACTION>]違反參照完整性的處理方法操作對(duì)象相關(guān)操作INSERTDELETEUPDATE

被參照表不需要檢查根據(jù)參照表中外鍵定義的ONDELETE…(用戶顯示定義的方式,提供四種:CASCADE、NOACTION

、SETNULL和SETDEFAULT(系統(tǒng)默認(rèn)的方式NOACTION)根據(jù)參照表中外鍵定義的ONUPDATE…(用戶顯示定義的方式,提供四種:CASCADE、NOACTION、SETNULL和SETDEFAULT(系統(tǒng)默認(rèn)的方式NOACTION)參照表違反則拒絕執(zhí)行不需要檢查違反則拒絕執(zhí)行參照完整性約束控制的實(shí)現(xiàn)【例8.4】新建選修SC表(學(xué)號(hào),課程號(hào),成績(jī)),并定義實(shí)體完整性和參照完整性。建立選修SC表(SNO,CNO,Grade)并定義主鍵和建立參照關(guān)系:CREATETABLESC(SNOCHAR(8),CNOCHAR(10),GradeNUMERIC(3),PRIMARYKEY(SNO,CNO),FOREIGNKEY(SNO)REFERENCESS(SNO)ONDELETECASCADE,FOREIGNKEY(CNO)REFERENCESC(CNO)ONUPDATENOACTION);參照完整性約束控制的實(shí)現(xiàn)【例8.4】新建選修SC表(學(xué)號(hào),課程號(hào),成績(jī)),并定義實(shí)體完整性和參照完整性。(1)往表中插入以下數(shù)據(jù)數(shù)據(jù):INSERTINTOSVALUES('A001','李紅',18);INSERTINTOSVALUES('A003','陳誠(chéng)',18);INSERTINTOCVALUES('C001','C語(yǔ)言');INSERTINTOSCVALUES('A001','C001',95);INSERTINTOSCVALUES('A003','C001',85);參照完整性約束控制的實(shí)現(xiàn)【例8.4】新建選修SC表(學(xué)號(hào),課程號(hào),成績(jī)),并定義實(shí)體完整性和參照完整性。(2)往SC表(參照關(guān)系)中插入數(shù)據(jù):INSERTINTOSCVALUES('A001','C002',95);由于C表(被參照關(guān)系)中無(wú)課程C002,違反了參照完整性,所以C表的更新操作失敗,系統(tǒng)拒絕插入。參照完整性約束控制的實(shí)現(xiàn)【例8.4】新建選修SC表(學(xué)號(hào),課程號(hào),成績(jī)),并定義實(shí)體完整性和參照完整性。(3)更新SC表(參照關(guān)系)中學(xué)號(hào)為“A001”,課程號(hào)為“C001”的記錄:UPDATESCSETSNO='A002'WHERESNO='A001'ANDCNO='C001';由于S表中無(wú)學(xué)生“A002”,所以SC表的更新操作失敗,系統(tǒng)拒絕更新。參照完整性約束控制的實(shí)現(xiàn)【例8.4】新建選修SC表(學(xué)號(hào),課程號(hào),成績(jī)),并定義實(shí)體完整性和參照完整性。(4)更新S表(被參照關(guān)系)中學(xué)號(hào)為“A001”的記錄:UPDATESSETSNO='A002'WHERESNO='A001';在S表更新學(xué)生“A001”的學(xué)號(hào)時(shí),在SC表中還存在著學(xué)生“A001”的選課信息,由于沒(méi)有定義外鍵SNO的更新操作,ONUPDATE子句默認(rèn)為NOACTION,故系統(tǒng)拒絕更新。參照完整性約束控制的實(shí)現(xiàn)【例8.4】新建選修SC表(學(xué)號(hào),課程號(hào),成績(jī)),并定義實(shí)體完整性和參照完整性。(5)更新C表(被參照關(guān)系)中課程號(hào)為“C001”的記錄:UPDATECSETCNO='C002'WHERECNO='C001';在C表更新課程“C001”時(shí),在SC表中還存在著課程“C001”的選課信息,且ONUPDATE子句中定義的是NOACTION,故系統(tǒng)拒絕更新。參照完整性約束控制的實(shí)現(xiàn)【例8.4】新建選修SC表(學(xué)號(hào),課程號(hào),成績(jī)),并定義實(shí)體完整性和參照完整性。(6)刪除S表(被參照關(guān)系)中學(xué)號(hào)為“A001”的記錄:DELETEFROMSWHERESNO='A001';在S表中刪除學(xué)生“A001”時(shí),在SC表中還存在著學(xué)生“A001”的信息,所以S表的刪除操作違反了參照完整性。由于定義了外鍵SNO的刪除操作為CASCADE,所以系統(tǒng)除了刪除S表中學(xué)生“A001”的記錄之外,還會(huì)刪除SC表中學(xué)生“A001”選修的記錄。參照完整性約束控制的實(shí)現(xiàn)【例8.4】新建選修SC表(學(xué)號(hào),課程號(hào),成績(jī)),并定義實(shí)體完整性和參照完整性。(7)刪除C表(被參照關(guān)系)中課程號(hào)為“C001”的記錄:DELETEFROMCWHERECNO='C001';在C表刪除課程“C001”時(shí),在SC表中還存在著課程“C001”的信息,所以C表的刪除操作違反了參照完整性。由于沒(méi)有定義外鍵CNO上的刪除操作,故默認(rèn)為ONDELETENOACTION,所以系統(tǒng)拒絕刪除課程表記錄。用戶自定義完整性約束NOTNULL非空DEFAULT

默認(rèn)值UNIQUE

唯一值CHECK

滿足表達(dá)式的取值用戶自定義完整性約束【例8.5】DEFAULT約束使用實(shí)例CREATETABLEEMPL(DnoNUMERIC(2),/*Dno為部門號(hào)*/EnoCHAR(8)UNIQUENOTNULL,/*屬性Eno取值唯一,而且不能為空*/SalaryNUMERIC(10)DEFAULT8000);/*屬性Salary具默認(rèn)值約束*/用戶自定義完整性約束【例8.6】UNIQUE約束使用實(shí)例CREATETABLEDEPT(DEPNONUMERIC(2),DnameCHAR(8)UNIQUENOTNULL,/*Dname為候選鍵*/LocationCHAR(10),PRIMARYKEY(DEPNO));/*在關(guān)系級(jí)別上定義主鍵*/用戶自定義完整性約束【例8.7】CHECK約束使用實(shí)例——在S表關(guān)系中限定Gender只能取“male”或“female”:ALTERTABLESADDCOLUMNGenderCHAR(1)CHECK(GenderIN('M','F'));用戶自定義完整性約束【例8.8】CHECK約束使用實(shí)例——在S表中加入CHECK約束S1——限制學(xué)生年齡為18到25歲:ALTERTABLESADDCONSTRAINTS1CHECK(SageBETWEEN18AND25);數(shù)據(jù)庫(kù)安全性保護(hù)安全性控制的一般模型安全性保護(hù)的措施用戶身份鑒別基于訪問(wèn)控制技術(shù)審計(jì)技術(shù)用戶身份鑒別【例8.9】在EMS數(shù)據(jù)庫(kù)內(nèi),添加、修改和刪除用戶的例子(1)創(chuàng)建用戶student1,密碼是student@123:CREATEUSERstudent1WITHPASSWORD"student@123";用戶身份鑒別【例8.9】在EMS數(shù)據(jù)庫(kù)內(nèi),添加、修改和刪除用戶的例子(2)將用戶student1的登錄密碼由student@123修改為abcd@123:ALTERUSERstudent1IDENTIFIEDBY'abcd@123'REPLACE'student@123';是系統(tǒng)提供的最外層安全保護(hù)措施,其方法是每個(gè)用戶在系統(tǒng)中必須有一個(gè)標(biāo)志自己身份的標(biāo)識(shí)符,用以和其它用戶相區(qū)別。用戶身份鑒別【例8.9】在EMS數(shù)據(jù)庫(kù)內(nèi),添加、修改和刪除用戶的例子(3)使用視圖PG_USER來(lái)查看當(dāng)前系統(tǒng)中的用戶列表:SELECT*FROMpg_user;用戶身份鑒別【例8.9】在EMS數(shù)據(jù)庫(kù)內(nèi),添加、修改和刪除用戶的例子(4)刪除用戶student1:DROPUSERstudent1CASCADE;基于訪問(wèn)控制技術(shù)訪問(wèn)控制(accesscontrol)就是一個(gè)數(shù)據(jù)庫(kù)用戶訪問(wèn)數(shù)據(jù)庫(kù)資源權(quán)限的一種規(guī)定和管理。是數(shù)據(jù)庫(kù)安全保護(hù)的主體技術(shù)。數(shù)據(jù)庫(kù)用戶類型角色機(jī)制授權(quán)回收數(shù)據(jù)庫(kù)用戶類型數(shù)據(jù)庫(kù)用戶管理員用戶初始用戶系統(tǒng)管理員普通用戶數(shù)據(jù)庫(kù)用戶管理【例8.10】添加各類用戶的例子(1)在EMS數(shù)據(jù)庫(kù)內(nèi),創(chuàng)建系統(tǒng)管理員用戶admin,密碼為admin@123:CREATEUSERadminWITHSYSADMINPASSWORD"admin@123";數(shù)據(jù)庫(kù)用戶管理【例8.10】添加各類用戶的例子(2)創(chuàng)建普通用戶student1,密碼是student1@123:CREATEUSERstudent1WITHPASSWORD"student1@123";數(shù)據(jù)庫(kù)用戶管理【例8.10】添加各類用戶的例子(3)創(chuàng)建安全管理員security1,密碼是security1@123:CREATEUSERsecurity1WITHCREATEROLEPASSWORD"security1@123";數(shù)據(jù)庫(kù)用戶管理【例8.10】添加各類用戶的例子(4)使用視圖pg_user來(lái)查看當(dāng)前系統(tǒng)中的用戶列表:SELECT*FROMpg_user;數(shù)據(jù)庫(kù)用戶管理【例8.10】添加各類用戶的例子(5)使用視圖pg_roles來(lái)查看當(dāng)前系統(tǒng)中的角色列表:SELECT*FROMpg_roles;數(shù)據(jù)庫(kù)用戶管理【例8.10】添加各類用戶的例子(6)使用系統(tǒng)表pg_authid來(lái)查看用戶屬性:SELECT*FROMpg_authidWHERErolsystemadmin='t’;/*該用戶是管理員用戶*/SELECT*FROMpg_authidWHERErolcreaterole='t’;/*該用戶擁有創(chuàng)建角色權(quán)限*/數(shù)據(jù)庫(kù)用戶管理(7)刪除student1用戶:DROPUSERstudent1;角色機(jī)制角色(Role)是一類具有相同數(shù)據(jù)權(quán)限的用戶(User)的集合。角色機(jī)制角色創(chuàng)建:GRANTROLE<角色名>;角色授權(quán):GRANT<權(quán)限>[,<權(quán)限>]…ON<數(shù)據(jù)對(duì)象類型><數(shù)據(jù)對(duì)象名>TO<角色名>[,<角色>]…角色機(jī)制將角色授予其它用戶:GRANT<角色名>[,<角色>]…TO<用戶名>[,<用戶名>]…[WITHGRANTOPTION];將角色授予其它角色:GRANT<角色名1>TO<角色名2>;角色機(jī)制角色收回:REVOKE<權(quán)限>[,<權(quán)限>]…ON<數(shù)據(jù)對(duì)象類型><數(shù)據(jù)對(duì)象名>FROM<角色名>[,<角色>]…角色機(jī)制授權(quán)語(yǔ)句:GRANT{<權(quán)限1>,<權(quán)限2>…|ALL}[ON<數(shù)據(jù)對(duì)象類型><數(shù)據(jù)對(duì)象名>]TO{<用戶/角色>[,用戶/角色]…|PUBLIC}[WITHGRANTOPTION]/*表示獲得權(quán)限的用戶可以將其獲得的權(quán)限繼續(xù)授權(quán)給其它用戶*/授權(quán)語(yǔ)句【例8.11】使用角色機(jī)制完成將權(quán)限授予用戶,由此可以看到角色機(jī)制可以使自主授權(quán)的執(zhí)行更加方便和靈活。(1)創(chuàng)建老師角色Teacher,密碼為teacher@123;創(chuàng)建學(xué)生用戶Raul,密碼為raul@123;創(chuàng)建學(xué)生用戶White,密碼為white@123;創(chuàng)建學(xué)生用戶Mary,密碼為mary@123:CREATEROLETeacherWITHPASSWORD"teacher@123";CREATEUSERRaulWITHPASSWORD"raul@123";CREATEUSERWhiteWITHPASSWORD"white@123";CREATEUSERMaryWITHPASSWORD"mary@123";授權(quán)語(yǔ)句【例8.11】使用角色機(jī)制完成將權(quán)限授予用戶,由此可以看到角色機(jī)制可以使自主授權(quán)的執(zhí)行更加方便和靈活。(2)將對(duì)“學(xué)生”表的查詢、更新和插入權(quán)授予角色Teacher:GRANTSELECT,UPDATE,INSERTONTABLE學(xué)生TOTeacher;授權(quán)語(yǔ)句【例8.11】使用角色機(jī)制完成將權(quán)限授予用戶,由此可以看到角色機(jī)制可以使自主授權(quán)的執(zhí)行更加方便和靈活。(3)將具有上述權(quán)限的角色授予Raul,White和Mary:GRANTTeacherTORaul,White,Mary;授權(quán)語(yǔ)句【例8.11】使用角色機(jī)制完成將權(quán)限授予用戶,由此可以看到角色機(jī)制可以使自主授權(quán)的執(zhí)行更加方便和靈活。(4)將Teacher賦予White的權(quán)限收回:REVOKETeacherFROMWhite;授權(quán)語(yǔ)句【例8.11】使用角色機(jī)制完成將權(quán)限授予用戶,由此可以看到角色機(jī)制可以使自主授權(quán)的執(zhí)行更加方便和靈活。(5)增加Teacher在“學(xué)生”表上的DELETE權(quán)限:GRANTDELETEONTABLE學(xué)生TOTeacher;授權(quán)語(yǔ)句【例8.11】使用角色機(jī)制完成將權(quán)限授予用戶,由此可以看到角色機(jī)制可以使自主授權(quán)的執(zhí)行更加方便和靈活。(6)收回Teacher在“學(xué)生”表上的UPDATE權(quán)限:REVOKEUPDATEONTABLE學(xué)生FROMTeacher;授權(quán)語(yǔ)句【例8.12】將“學(xué)生”表的SELECT權(quán)力和對(duì)其中學(xué)號(hào)的UPDATE權(quán)授予用戶Tom,Lily:(1)創(chuàng)建用戶Tom,Lily:CREATEUSERTomWITHPASSWORD"Tom@1234";CREATEUSERLilyWITHPASSWORD"Lily@1234";授權(quán)語(yǔ)句【例8.12】將“學(xué)生”

溫馨提示

  • 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)論