版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
DatabaseTechnology&Applications數(shù)據(jù)庫技術(shù)及應(yīng)用關(guān)系模式范式關(guān)系模式的范式關(guān)系模式的范式指的是關(guān)系模式應(yīng)該遵循的規(guī)范化形式。第一范式第二范式第三范式BC范式第一范式對于關(guān)系模式R,如果其每個屬性都是簡單屬性,即每個屬性都是不可再分的,則稱R屬于第一范式,簡記為1NF。關(guān)系模式的第一范式是關(guān)系模式要遵循的最基本的規(guī)范化形式。第一范式【例6.17】設(shè)有以下關(guān)系r,請問r是否屬于第一范式?學(xué)號姓名電話202113871633李M)H)202113871634章M)【解答】由于在關(guān)系r中,電話屬性可進一步劃分為移動電話(M)和家庭電話(H),因此,關(guān)系r不屬于第一范式??刹捎靡韵路椒▽規(guī)范化成第一范式:學(xué)號姓名移動電話家庭電話202113871633李凌15912312321020-37648277202113871634章一范式【例6.17】設(shè)有以下關(guān)系r,請問r是否屬于第一范式?學(xué)號姓名電話202113871633李M)H)202113871634章M)【解答】由于在關(guān)系r中,電話屬性可進一步劃分為移動電話(M)和家庭電話(H),因此,關(guān)系r不屬于第一范式??刹捎靡韵路椒▽規(guī)范化成第一范式:學(xué)號姓名電話電話類型202113871633李動電話202113871633李庭電話202113871634章動電話第一范式【例6.17】設(shè)有以下關(guān)系r,請問r是否屬于第一范式?學(xué)號姓名電話202113871633李M)H)202113871634章M)【解答】由于在關(guān)系r中,電話屬性可進一步劃分為移動電話(M)和家庭電話(H),因此,關(guān)系r不屬于第一范式??刹捎靡韵路椒▽規(guī)范化成第一范式:學(xué)號姓名電話202113871633李凌15912312321202113871634章二范式對于函數(shù)依賴X→Y,如果存在X的真子集X’,使得X’→Y也成立,則稱Y部分依賴于X。對于函數(shù)依賴X→Y,如果X的任一真子集X’,都沒有X’→Y成立,則稱Y完全依賴于X。如果關(guān)系模式R為1NF,并且R中的每一個非主屬性都完全依賴于R的某個候選關(guān)鍵字,則稱R屬于第二范式,簡記為2NF。
第二范式【例6.18】設(shè)有關(guān)系模式R(A,B,C)及其上面的函數(shù)依賴集F={A→B,B→A,C→A},試分析R是否屬于第二范式?!窘獯稹恳驗镃→A,A→B,根據(jù)Armstrong公理的傳遞律有C→B,所以有C→ABC,則C是主鍵,且A和B都完全依賴于C,因此R屬于第二范式。
將非2NF的關(guān)系模式分解為滿足2NF的關(guān)系模式集(1)用主屬性構(gòu)成的屬性集的每一個子集作為主鍵構(gòu)成一個關(guān)系模式。(2)把依賴于這些主鍵的屬性加到對應(yīng)的關(guān)系模式中。(3)去掉只有主鍵構(gòu)成的關(guān)系模式。
第二范式【例6.19】設(shè)有關(guān)系模式R(學(xué)號,學(xué)生姓名,課程號,課程名,成績,任課教師),試分析R是否屬于第二范式。如果R不屬于第二范式,請將R分解成滿足第二范式的關(guān)系模式集。【解答】關(guān)系模式R中存在以下函數(shù)依賴:學(xué)號→學(xué)生姓名、課程號→課程名、課程號→任課教師、(學(xué)號,課程號)→成績,因此,關(guān)系模式R的主鍵是(學(xué)號,課程號)。而學(xué)生姓名、課程名、任課教師等屬性部分依賴于該主鍵,因此關(guān)系模式R不屬于第二范式。
第二范式【例6.19】設(shè)有關(guān)系模式R(學(xué)號,學(xué)生姓名,課程號,課程名,成績,任課教師),試分析R是否屬于第二范式。如果R不屬于第二范式,請將R分解成滿足第二范式的關(guān)系模式集。【解答(續(xù))】將R分解成滿足第二范式的關(guān)系模式集,過程如下:
R1(學(xué)號,學(xué)生姓名)R2(課程號,課程名,任課教師)R3(學(xué)號,課程號,成績)R1(學(xué)號)R2(課程號)
R3(學(xué)號,課程號)R第三范式如果有函數(shù)依賴X→Y,Y→Z成立,且Y→X不成立,Z不是Y的子集,則稱Y傳遞依賴于X。如果關(guān)系模式R為2NF,并且R中的每一個非主屬性都不傳遞依賴于R的某個候選關(guān)鍵字,則稱R屬于第三范式,簡記為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é)號,學(xué)生姓名,課程號,課程名,成績,任課教師,教師所屬學(xué)院),試分析R是否屬于第三范式。如果R不屬于第三范式,請將R分解成滿足第三范式的關(guān)系模式集?!窘獯稹縍中存在以下函數(shù)依賴:學(xué)號→學(xué)生姓名、課程號→課程名、課程號→任課教師、任課教師→教師所屬學(xué)院、(學(xué)號,課程號)→成績,因此,R的主鍵是(學(xué)號,課程號)。而學(xué)生姓名、課程名、任課教師等屬性部分依賴于該主鍵,因此R不屬于第二范式,也不屬于第三范式。第三范式
【例6.21】設(shè)有關(guān)系模式R(學(xué)號,學(xué)生姓名,課程號,課程名,成績,任課教師,教師所屬學(xué)院),試分析R是否屬于第三范式。如果R不屬于第三范式,請將R分解成滿足第三范式的關(guān)系模式集?!窘獯穑ɡm(xù)1)】R1(學(xué)號,學(xué)生姓名)2NFR2(課程號,課程名,任課教師,教師所屬學(xué)院)2NFR3(學(xué)號,課程號,成績)2NFRR1(學(xué)號,學(xué)生姓名)3NFR2(課程號,課程名,任課教師,教師所屬學(xué)院)2NFR3(學(xué)號,課程號,成績)3NF第三范式
【例6.21】設(shè)有關(guān)系模式R(學(xué)號,學(xué)生姓名,課程號,課程名,成績,任課教師,教師所屬學(xué)院),試分析R是否屬于第三范式。如果R不屬于第三范式,請將R分解成滿足第三范式的關(guān)系模式集。【解答(續(xù)2)】RR5(任課教師,教師所屬學(xué)院)R4(課程號,課程名,任課教師)3NF3NF
無損連接并保持函數(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不屬于第三范式,請將R分解為無損連接和保持函數(shù)依賴的滿足3NF的關(guān)系模式集?!窘獯稹拷?jīng)分析可得,R的主鍵是AC。B和D對主鍵是部分依賴,因此R不屬于3NF。將R分解過程如下:(1)根據(jù)最小函數(shù)依賴集的定義,可知F就是一個最小函數(shù)依賴集。(2)沒有一個函數(shù)依賴的左右邊相加等于關(guān)系模式R的所有屬性,因此,R需要分解。(3)對于函數(shù)依賴A→B,構(gòu)建一個關(guān)系模式R1(A,B);對于函數(shù)依賴C→D,構(gòu)建一個關(guān)系模式R2(C,D)。(4)R的唯一候選鍵是AC,而R1和R2都不包含AC,因此需要單獨構(gòu)建一個關(guān)系模式R3(A,C)。(5)分解結(jié)束,得到一個無損連接和保持函數(shù)依賴的滿足3NF的關(guān)系模式集{R1(A,B),R2(C,D),R3(A,C)}。無損連接并保持函數(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},請將R分解為無損連接和保持函數(shù)依賴的滿足3NF的關(guān)系模式集?!窘獯稹浚?)根據(jù)最小函數(shù)依賴集的定義,可知F不是一個最小函數(shù)依賴集。因此,首先求F的最小函數(shù)依賴集Fmin:把F中右邊包含多個屬性的函數(shù)依賴分解為右邊只包含一個屬性的函數(shù)依賴,得到與F等價的G,G={W→X,W→Y,Y→Z,XZ→Y,X→Y}。刪除G中冗余的函數(shù)依賴:由于X→Y,根據(jù)Armstrong公理的增廣律,XZ→YZ成立,可把XZ→Y刪除,得到與G等價的函數(shù)依賴集H,H={W→X,W→Y,Y→Z,X→Y}。H中各個函數(shù)依賴的左部不存在冗余屬性,因此,H即為Fmin。無損連接并保持函數(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},請將R分解為無損連接和保持函數(shù)依賴的滿足3NF的關(guān)系模式集?!窘獯穑ɡm(xù))】(2)沒有一個函數(shù)依賴的左右邊相加等于關(guān)系模式R的所有屬性,因此,R需要分解。(3)對于W→X,構(gòu)建R1(W,X);對于W→Y,構(gòu)建R2(W,Y);由于W→X和W→Y的左部相等,因此把R1和R2合并得到R3(W,X,Y)。對于Y→Z和X→Y,分別構(gòu)建R4(Y,Z)和R5(X,Y)。(4)R的唯一候選鍵是W,R3中包含W,因此不需要單獨構(gòu)建一個只包含W的關(guān)系模式。(5)分解結(jié)束,得到一個無損連接和保持函數(shù)依賴的滿足3NF的關(guān)系模式集{R3(W,X,Y),R4(Y,Z),R5(X,Y)}。無損連接并保持函數(shù)依賴地把關(guān)系模式R分解成3NF關(guān)系模式集Boyce-Codd范式如果關(guān)系模式R為1NF,并且R中的每一個函數(shù)依賴X→Y(Y?X),必有X是R的超鍵,則稱R屬于Boyce-Codd范式,簡記為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是主鍵,因此,對于函數(shù)依賴Y→Z,其左邊不是R的超鍵,因此R不屬于BCNF。
輸入:關(guān)系模式R(U)及在其上面的函數(shù)依賴集F輸出:R的一個分解ρ={R1,R2,…,Rn},且ρ是無損連接的分解步驟如下:(1)初始化置ρ={R}。(2)如果ρ中所有關(guān)系模式都是BCNF,轉(zhuǎn)(4)。(3)如果ρ中有一個關(guān)系模式S不是BCNF,那么在S中必能找到一個函數(shù)依賴X→A,X不是S的超鍵且A?X,把S分解為S1和S2,S1=XA,S2=S-A。轉(zhuǎn)(2)。(4)分解結(jié)束,輸出ρ。值得注意的是,在步驟(3)中,若存在多個函數(shù)依賴X→A,X不是S的超鍵且A?X,對這些函數(shù)依賴處理的順序不一樣,得到的BCNF關(guān)系模式集有可能不一樣。把關(guān)系模式R無損連接地分解成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,請將R無損連接地分解為滿足BCNF的關(guān)系模式集。【解答1】R的主鍵是(A,B,C),因為BC→D和D→E的左邊都不是R的超鍵,所以R不屬于BCNF。把關(guān)系模式R無損連接地分解成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,請將R無損連接地分解為滿足BCNF的關(guān)系模式集。【解答2】R的主鍵是(A,B,C),因為BC→D和D→E的左邊都不是R的超鍵,所以R不屬于BCNF。把關(guān)系模式R無損連接地分解成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:下面一種比上面一種要求更嚴格。要符合某一種范式必須也滿足它上邊的所有范式。
規(guī)范化的實質(zhì)根據(jù)語義確定參與數(shù)據(jù)庫的各個屬性確定哪些是主屬性,哪些是非主屬性確定所有的候選關(guān)鍵字并且選定主鍵找出屬性間的函數(shù)依賴和多值依賴關(guān)系模式分解原則設(shè)計出來的關(guān)系模式至少要達到3NF的要求無損連接保持函數(shù)依賴分解出來的關(guān)系模式個數(shù)和屬性總數(shù)越少越好
本章小結(jié)函數(shù)依賴Armstrong公理最小函數(shù)依賴集無損連接的分解保持函數(shù)依賴的分解1NF、2NF、3NF、BCNF感謝觀看!DatabaseTechnology&Applications數(shù)據(jù)庫技術(shù)及應(yīng)用SQL概述SQL的功能SQL功能動詞數(shù)據(jù)定義CREATEDROPALTER數(shù)據(jù)更新INSERTUPDATEDELETE數(shù)據(jù)查詢SELECT
數(shù)據(jù)控制GRANTREVOKE
SQL(StructuredQueryLanguage)是1974年由IBM公司的RayBoyce和DonChamberlin依據(jù)Codd關(guān)系數(shù)據(jù)庫的12條準則的數(shù)學(xué)定義提出來的。SQL的特點一體化非過程化面向集合一種語法兩種使用方式簡潔易學(xué)關(guān)系數(shù)據(jù)庫的實現(xiàn)(以openGauss為例)連接數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫創(chuàng)建表結(jié)構(gòu)建立表間關(guān)系向表中輸入數(shù)據(jù)連接openGauss數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫創(chuàng)建表結(jié)構(gòu)openGauss常用的數(shù)據(jù)類型及其使用方法數(shù)據(jù)類型使用說明大小數(shù)值可用來進行算術(shù)計算的數(shù)字數(shù)據(jù)。設(shè)置“字段大小”屬性定義一個特定的數(shù)字類型。其中NUMERIC、DECIMAL是任意精度類型。1、2、4或8個字節(jié),與“字段大小”屬性定義有關(guān)。例如NUMERIC[(p[,s])],DECIMAL[(p[,s])],p為總位數(shù),s為小數(shù)位數(shù)日期/時間用于存儲日期和時間值4、8、12、16個字節(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ù)——手動輸入數(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ù)對象創(chuàng)建數(shù)據(jù)對象定義撤消更改數(shù)據(jù)庫CREATEDATABASEDROPDATABASEALTERDATABASE基本表CREATETABLEDROPTABLEALTERTABLE視圖CREATEVIEWDROPVIEW
索引CREATEINDEXDROPINDEX
結(jié)構(gòu)定義CREATECREATEDATABASE<數(shù)據(jù)庫模式名>CREATETABLE<表名>(<列名><數(shù)據(jù)類型>[列級完整性約束條件][,<列名><數(shù)據(jù)類型>[列級完整性約束條件]]……[,<表級完整性約束條件>])其中[]內(nèi)的內(nèi)容是可選項。結(jié)構(gòu)定義CREATE【例7.1】在Navicat中用SQL語句來實現(xiàn)7.1.2節(jié)中通過圖形化界面創(chuàng)建的數(shù)據(jù)庫和表。
用CREATEDATABASE命令創(chuàng)建“選課管理數(shù)據(jù)庫”(EMS):結(jié)構(gòu)定義CREATE【例7.1】在Navicat中用SQL語句來實現(xiàn)7.1.2節(jié)中通過圖形化界面創(chuàng)建的數(shù)據(jù)庫和表。CREATETABLEpublic.課程(
課程號varchar(35)NOTNULL,
課程名varchar(20)NOTNULL,
學(xué)時int2NOTNULL,
學(xué)分float4NOTNULL,CONSTRAINTCourse_pkeyPRIMARYKEY(課程號));結(jié)構(gòu)定義CREATE【例7.1】在Navicat中用SQL語句來實現(xiàn)7.1.2節(jié)中通過圖形化界面創(chuàng)建的數(shù)據(jù)庫和表。CREATETABLEpublic.學(xué)生(
身份證號varchar(18)NOTNULL,
學(xué)號varchar(12)NOTNULL,
姓名varchar(10)NOTNULL,
性別varchar(1)NOTNULLDEFAULT'男'::charactervarying,
班級varchar(20),
生日dateNOTNULL,CONSTRAINT"學(xué)生_pkey"PRIMARYKEY(學(xué)號),CONSTRAINT"學(xué)生_性別_check"CHECK(性別='男’or性別='女'));結(jié)構(gòu)定義CREATE【例7.1】在Navicat中用SQL語句來實現(xiàn)7.1.2節(jié)中通過圖形化界面創(chuàng)建的數(shù)據(jù)庫和表。CREATETABLEpublic.選修(
課程號varchar(35)NOTNULL,
學(xué)號varchar(12)NOTNULL,
成績int4,CONSTRAINT選修_pkeyPRIMARYKEY(課程號,學(xué)號),CONSTRAINTFK_學(xué)號FOREIGNKEY(學(xué)號)REFERENCESpublic.學(xué)生(學(xué)號)ONDELETENOACTIONONUPDATENOACTION,CONSTRAINTFK_課程號FOREIGNKEY(課程號)REFERENCESpublic.課程(課程號)ONDELETENOACTIONONUPDATENOACTION);結(jié)構(gòu)更新ALTER增加屬性列ALTERTABLE<基本表名>ADD<新列名><數(shù)據(jù)類型>[完整性約束條件]-<表名>是要更新的基本表名稱-ADD子句用于增加新列和新的完整性約束條件【例7.2】在“學(xué)生”表中添加一個新的地址屬性ADDRESS。ALTERTABLE學(xué)生ADDADDRESSVARCHAR(30);結(jié)構(gòu)更新ALTER刪除屬性列ALTERTABLE<基本表名>DROP<屬性列名>[CASCADE|RESTRAIN]-CASCADE表示在基本表刪除某屬性列時,所有引用到該屬性列的視圖和約束也要一起自動刪除-RESTRAIN表示在沒有視圖或約束引用該屬性列時,才可以在基本表中刪除該列,否則就拒絕刪除操作【例7.3】在“學(xué)生”表中刪除屬性列ADDRESS。ALTERTABLE學(xué)生DROPADDRESSCASCADE;結(jié)構(gòu)更新ALTER修改屬性列ALTERTABLE<基本表名>MODIFY<屬性列名><類型>【例7.4】在“學(xué)生”表中將學(xué)號的長度修改為“12”。ALTERTABLE學(xué)生MODIFY學(xué)號CHAR(12);結(jié)構(gòu)更新ALTER補充定義主鍵ALTERTABLE<表名>ADDPRIMARYKEY(<列名表>)需要指出,被定義為主鍵的屬性列應(yīng)當(dāng)是非空和滿足唯一性要求的。結(jié)構(gòu)更新ALTER刪除主鍵ALTERTABLE<表名>DROPPRIMARYKEY(<列名表>)或者ALTERTABLE<表名>DROPCONSTRAINT<主鍵約束名>【例7.5】刪除“學(xué)生”表中主鍵“學(xué)號”的SQL語句如下。ALTERTABLE學(xué)生DROPCONSTRAINT學(xué)生_pkeyCASCADE;結(jié)構(gòu)更新ALTER【例7.6】在“學(xué)生”表中添加主鍵“學(xué)號”以及在“選修”表中添加外鍵的SQL語句如下。ALTERTABLE學(xué)生ADDPRIMARYKEY(學(xué)號);ALTERTABLE選修ADDCONSTRAINTFK_學(xué)號FOREIGNKEY(學(xué)號)REFERENCESpublic.學(xué)生(學(xué)號)ONDELETENOACTIONONUPDATENOACTION;結(jié)構(gòu)撤銷DROP【例7.7】撤銷“學(xué)生”表,但要求只有在沒有視圖或約束引用“學(xué)生”表的屬性列時才能撤銷,否則拒絕撤銷。DROPTABLE學(xué)生RESTRICT;DROPDATABASE<數(shù)據(jù)庫名>DROPTABLE<基本表名>[CASCADE|RESTRICT]-RESTRICT表示沒有視圖或約束引用“學(xué)生”表的屬性列時才能撤銷,否則拒絕撤銷,意味著要先刪除視圖或相關(guān)約束,再來刪除該表。-CASCADE表示刪除表的時候會把相關(guān)的視圖等一并刪除。數(shù)據(jù)查詢SELECT基本語法SELECT[ALL|DISTINCT]<屬性名>[,<屬性名>]…FROM<基本表名或視圖名>[,<基本表名或視圖名>]…[WHERE<邏輯條件式>][GROUPBY<屬性名1>[HAVING<邏輯表達式>]][ORDERBY<屬性名2>[ASC|DESC]]單表查詢【例7.8】在“選課管理數(shù)據(jù)庫”中查詢“課程”表的全部記錄情況。SELECT*FROM課程;單表查詢【例7.9】在“學(xué)生”表中查詢學(xué)生的學(xué)號、姓名和性別。SELECT學(xué)號,姓名,性別FROM學(xué)生;單表查詢【例7.10】(查詢指定屬性列)查詢所有選修了課程的學(xué)生的學(xué)號。SELECT學(xué)號FROM選修;說明:該查詢的結(jié)果中會有重復(fù)的學(xué)號。SELECT后加DISTINCT即可去掉重復(fù)學(xué)號:SELECTDISTINCT學(xué)號FROM選修;單表查詢【例7.11】查詢?nèi)w學(xué)生的分數(shù)都增加10分后的“選修”表。SELECT學(xué)號,成績+10FROM選修;具條件的屬性列查詢運算符含義集合成員運算IN,NOTIN在集合中,不在集合中字符匹配運算LIKE與-和%進行單個、多個字符匹配空值運算ISNULL,ISNOTNULL為空,不能為空比較運算>,>=,<,,=<,=,<>大于,大于等于,小于,小于等于,等于,不等于邏輯運算AND,OR,NOT與,或,非,具條件的屬性列查詢【例7.12】在“選修”表中查找不及格的學(xué)生的學(xué)號。SELECT學(xué)號FROM選修WHERE成績<60;具條件的屬性列查詢【例7.13】在“選修”表中查找課程號為“1026”的不及格的學(xué)生學(xué)號。SELECT學(xué)號FROM選修WHERE成績<60AND課程號='1026';具條件的屬性列查詢【例7.14】在“選修”表中查找成績在[60,80]這個區(qū)間內(nèi)的記錄。SELECT*FROM選修WHERE成績BETWEEN60AND80;具條件的屬性列查詢【例7.15】在“選修”表中查找成績?yōu)閧60,70,80}的學(xué)生。SELECT*FROM選修WHERE成績IN(60,70,80);查詢通配符通配符含
義%包含0個或多個字符_包含1個字符[]指定范圍,如[a-d]代表a、b、c和d[^]不屬于指定的范圍,如[^a-d]代表排除了a、b、c和d以外的其他字符查詢通配符【例7.16】顯示“學(xué)生”表中姓“馬”的同學(xué)的基本信息。SELECT*FROM學(xué)生WHERE姓名LIKE'馬%';查詢通配符【例7.17】若要查找的馬姓同學(xué)的姓名只有兩個字。SELECT*FROM學(xué)生WHERE姓名LIKE'馬_';空值查詢【例7.18】將“選修”表中有成績的記錄顯示出來。SELECT*FROM選修WHERE成績ISNOTNULL;排序查詢【例7.19】在“學(xué)生”表中查詢學(xué)生的基本情況(包括學(xué)生的學(xué)號、姓名和性別),結(jié)果按照學(xué)號的降序排列。SELECT學(xué)號,姓名,性別FROM學(xué)生ORDERBY學(xué)號DESC;若將DESC改成ASC或者不寫,則查詢結(jié)果會根據(jù)ORDERBY后面的字段升序排列。排序查詢【例7.20】在“學(xué)生”表中查詢學(xué)生的基本情況,并按性別的升序顯示結(jié)果;對于性別相同的記錄,再按學(xué)號的降序進行排列。SELECT*FROM學(xué)生ORDERBY性別ASC,學(xué)號DESC;排序查詢【例7.21】在“選修”表中查找課程號為“1026”的成績最高的前三名學(xué)生的學(xué)號。SELECT學(xué)號FROM選修WHERE課程號='1026'ORDERBY成績DESCLIMIT3;連接查詢內(nèi)連接(INNERJOIN)外連接(OUTERJOIN)連接(LEFTJOIN)右連接(RIGHTJOIN)全連接(FULLJOIN)內(nèi)連接基本語法SELECT<屬性或表達式列表>FROM<表名>[INNER]JOIN<表名>ON<連接條件>/USING<字段1>[WHERE<限定條件>]只有滿足給出的連接條件時,相應(yīng)結(jié)果才會出現(xiàn)在結(jié)果關(guān)系表中。內(nèi)連接【例7.22】查詢選修了課程號為“1025”課程的所有學(xué)生學(xué)號與姓名。SELECT學(xué)生.學(xué)號,姓名FROM學(xué)生JOIN選修ON學(xué)生.學(xué)號=選修.學(xué)號WHERE課程號=’1025’;SELECT學(xué)生.學(xué)號,姓名FROM學(xué)生JOIN選修USING(學(xué)號)WHERE課程號='1025';SELECT學(xué)生.學(xué)號,姓名FROM學(xué)生,選修WHERE學(xué)生.學(xué)號=選修.學(xué)號AND課程號='1025';內(nèi)連接【例7.23】查詢修讀課程名為“數(shù)據(jù)庫”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生JOIN選修ON學(xué)生.學(xué)號=選修.學(xué)號JOIN課程ON選修.課程號=課程.課程號WHERE課程名='數(shù)據(jù)庫';內(nèi)連接【例7.24】查詢至少修讀了學(xué)生學(xué)號為“202101231234”所修讀的一門課的學(xué)生學(xué)號。SELECT選修1.學(xué)號FROM選修選修1,選修選修2WHERE選修1.課程號=選修2.課程號AND選修2.學(xué)號=‘202101231234’;外連接【例7.25】查詢所有學(xué)生的基本信息和選課情況。SELECT學(xué)號,姓名,生日,班級,身份證號,課程號,成績FROM學(xué)生JOIN選修ON學(xué)生.學(xué)號=選修.學(xué)號;學(xué)生李敏沒有選修任何課程,由于在“選修”表沒有李敏的相應(yīng)元組,所以查詢結(jié)果中不會出現(xiàn)她的學(xué)號。外連接基本語法SELECT<屬性或表達式列表>FROM<表名>LEFT|RIGHT|FULL[OUTER]JOIN<表名>ON<連接條件>/USING<字段1>[WHERE<限定條件>]外連接【例7.26】查詢所有學(xué)生的基本信息和選課情況。SELECT學(xué)生.學(xué)號,姓名,班級,身份證號,課程號,成績FROM學(xué)生LEFTJOIN選修ON學(xué)生.學(xué)號=選修.學(xué)號;外連接【例7.27】查詢所有課程的基本信息和被選修的情況,包括沒有人選修的也要列出。SELECT課程.課程號,課程名,學(xué)時,學(xué)分,成績FROM選修RIGHTJOIN課程ON學(xué)生.學(xué)號=選修.學(xué)號;嵌套查詢作為WHERE子句中的邏輯表達式,嵌套子查詢有三種形式:字段[NOT]IN子查詢字段θSOME/ANY/ALL子查詢[NOT]EXISTS(子查詢)嵌套查詢【例7.28】查詢修讀課程號為“1025”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生WHERE學(xué)號IN (SELECT學(xué)號 FROM選修 WHERE課程號=‘1025’);嵌套查詢【例7.29】查詢沒有修讀課程號為“1025”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生WHERE學(xué)號NOTIN (SELECT學(xué)號 FROM選修 WHERE課程號=‘1025’);嵌套查詢【例7.30】查詢修讀課程名為“數(shù)據(jù)庫”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生 WHERE學(xué)號IN(SELECT學(xué)號FROM選修
WHERE課程號IN (SELECT課程號FROM課程 WHERE課程名=‘?dāng)?shù)據(jù)庫’));嵌套查詢【例7.31】查詢修讀課程號為“1025”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生WHERE學(xué)號=SOME (SELECT學(xué)號 FROM選修 WHERE課程號=‘1025’);嵌套查詢【例7.32】查詢沒有修讀課程號為“1025”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生WHERE學(xué)號<>ALL (SELECT學(xué)號 FROM選修 WHERE課程號=‘1025’);嵌套查詢【例7.33】查詢課程號為“1025”的最高分的學(xué)生姓名。SELECT姓名FROM學(xué)生INNERJOIN選修USING(學(xué)號)WHERE課程號=‘1025’AND成績>=ALL (SELECT成績
FROM選修
WHERE課程號=‘1025’AND成績ISNOTNULL);嵌套查詢【例7.34】查詢學(xué)生“賀易”本期選修課程號“1025”的成績。SELECT成績FROM選修WHERE課程號=‘1025’AND學(xué)號=(SELECT學(xué)號 FROM學(xué)生 WHERE姓名=‘賀易’);嵌套查詢【例7.35】查詢修讀課程號為“1025”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生WHEREEXISTS (SELECT* FROM選修 WHERE課程號=’1025’AND學(xué)生.學(xué)號=選修.學(xué)號);嵌套查詢【例7.36】查詢沒有修讀課程號為“1025”的所有學(xué)生的姓名。SELECT姓名FROM學(xué)生WHERENOTEXISTS (SELECT* FROM選修 WHERE課程號=‘1025’AND學(xué)生.學(xué)號=選修.學(xué)號);嵌套查詢【例7.37】查詢課程號為“1025”的最高分的學(xué)生姓名。SELECT姓名FROM學(xué)生INNERJOIN選修選修1ON學(xué)生.學(xué)號=選修1.學(xué)號WHERE課程號=‘1025’ANDNOTEXISTS
(SELECT* FROM選修選修2WHERE課程號=‘1025’AND選修1.成績<選修2.成績);嵌套查詢【例7.38】查詢學(xué)生“賀易”選修課程號“1025”的成績。SELECT成績FROM選修WHERE課程號=‘1025’ANDEXISTS
(SELECT* FROM學(xué)生 WHERE姓名=‘賀易’AND選修.學(xué)號=學(xué)生.學(xué)號);聚合函數(shù)COUNT函數(shù)ICOUNT([DISTINCT|ALL]*)統(tǒng)計關(guān)系中元組個數(shù)。COUNT函數(shù)IICOUNT([DISTINCT|ALL]<列名>)統(tǒng)計關(guān)系中給定列中屬性值個數(shù)。SUM函數(shù)SUM([DISTINCT|ALL]<列名>)計算關(guān)系中數(shù)值型屬性值總和。AVG函數(shù)AVG([DISTINCT|ALL]<列名>)計算關(guān)系中數(shù)值型屬性值平均值。MAX函數(shù)MAX([DISTINCT|ALL]<列名>)計算關(guān)系中給定屬性列中數(shù)值型屬性值的最大者。MIN函數(shù)MIN([DISTINCT|ALL]<列名>)計算關(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é)號)WHERE姓名=’張怡’;聚合函數(shù)【例7.41】查詢學(xué)號為“202101231234”的學(xué)生所修讀課程的平均成績。SELECTAVG(成績)FROM選修WHERE學(xué)號=‘202101231234’;聚合函數(shù)【例7.42】查詢可供學(xué)生選修的課程門數(shù)。SELECTCOUNT(*)FROM課程;聚合函數(shù)【例7.43】查詢已有學(xué)生選修的課程門數(shù)。SELECTCOUNT(DISTINCT課程號)FROM選修;分組基本語法SELECT[ALL|DISTINCT]<屬性名>[,<屬性名>]…FROM<基本表名或視圖名>[,<基本表名或視圖名>]…[WHERE<邏輯條件式>][GROUPBY<屬性名1>[HAVING<邏輯表達式>]][ORDERBY<屬性名2>[ASC|DESC]]分組【例7.44】給出每門課程的平均成績。SELECT課程號,AVG(成績)FROM選修GROUPBY課程號;分組【例7.45】給出每個學(xué)生修讀課程的門數(shù):SELECT學(xué)號,COUNT(課程號)FROM選修GROUPBY學(xué)號;分組【例7.46】例7.33選修課程號為“1025”的最高分的學(xué)生姓名的查詢也可以寫為:SELECT姓名FROM學(xué)生INNERJOIN選修ON學(xué)生.學(xué)號=選修.學(xué)號WHERE課程號=‘1025’AND成績=SOME
(SELECTMAX(成績) FROM選修
WHERE課程號=‘1025’);分組【例7.47】給出有10個或10個以上學(xué)生所修讀課程的課程號和學(xué)生數(shù)。SELECT課程號,COUNT(學(xué)號)FROM選修GROUPBY課程號HAVINGCOUNT(*)>=10;數(shù)據(jù)更新數(shù)據(jù)更新功能刪除插入修改基本語句DELETEFROM<表名>[WHERE<條件>]INSERTINTO<表名>[屬性列]…VALUES(屬性值1,屬性值2,…)或子查詢UPDATE<表名>SET屬性名=屬性值,…[WHERE<條件>]基本語義刪除元組插入元組修改屬性值數(shù)據(jù)刪除基本語法DELETEFROM<基本表名>WHERE<條件>刪除多個元組的值【例7.48】刪除學(xué)生“劉玉”的記錄。DELETEFROM學(xué)生WHERE姓名=‘劉玉’;帶子查詢刪除語句【例7.49】刪除21醫(yī)學(xué)院全體學(xué)生的選課記錄。DELETEFROM選修WHERE‘21醫(yī)學(xué)院’=(SELECT班級
FROM學(xué)生 WHERE學(xué)生.學(xué)號=選修.學(xué)號);數(shù)據(jù)插入基本語法INSERTINTO<表名>(字段列表)VALUES(值列表)或INSERTINTO<表名>(字段列表)子查詢數(shù)據(jù)插入【例7.50】往“課程”表添加入一條課程號為“1032”,課程名為“大學(xué)物理”,學(xué)時為64,學(xué)分為3的記錄。INSERTINTO課程(課程號,課程名,學(xué)時,學(xué)分)VALUES('1032','大學(xué)物理',64,3);或INSERTINTO課程VALUES('1032','大學(xué)物理',64,3);數(shù)據(jù)插入【例7.51】將一個學(xué)生新記錄(身份證號學(xué)號202101231255,姓名:陳靜,性別:女,生日:2001-12-29)插入到“學(xué)生”表中。INSERTINTO學(xué)生(身份證號,學(xué)號,姓名,性別,生日)VALUES(,'202101231255','陳靜','女','2001-12-29');數(shù)據(jù)插入【例7.52】創(chuàng)建一張新表“學(xué)生平均分”,有兩個字段(學(xué)號,成績),將每個學(xué)生選修的平均分放至該表中。CREATETABLE學(xué)生平均分(學(xué)號varchar(12)NOTNULL,成績int4);INSERTINTO學(xué)生平均分SELECT學(xué)號,AVG(成績)FROM選修GROUPBY學(xué)號;數(shù)據(jù)修改基本語法UPDATE<基本表名>SET<列名>=表達式[,<列名>=表達式]…WHERE<邏輯條件>數(shù)據(jù)修改【例7.53】將“選修”表里所有記錄的成績字段增加5。UPDATE選修SET成績=成績+5;數(shù)據(jù)修改【例7.54】將“課程”表里課程名為“計算機基礎(chǔ)”的課程改名為“大學(xué)計算機基礎(chǔ)”。UPDATE課程SET課程名='大學(xué)計算機基礎(chǔ)'WHERE課程名='計算機基礎(chǔ)';視圖管理視圖的作用視圖是一張?zhí)摫?,?shù)據(jù)來自由定義視圖的查詢所引用的表。對視圖進行數(shù)據(jù)更新時實際上是對基本表進行相應(yīng)的更新(一般對視圖的更新操作是有很多限制條件的)。在openGauss中不支持視圖的更新。SQL視圖管理機制的意義簡化用戶操作用戶可以多角度看待同一數(shù)據(jù)提供一定的邏輯獨立性對數(shù)據(jù)提供各種角度的安全保護視圖創(chuàng)建基本語法CREATEVIEW<視圖名>([<列名>[,<列名>]…])AS<子查詢>[WITHCHECKOPTION];//表示用視圖進行更新、插入和刪除操作時要保證更新的元組滿足視圖定義中的謂詞條件。視圖創(chuàng)建【例7.55】創(chuàng)建一個“21計算機學(xué)院”的學(xué)生視圖:CREATEVIEWCS21_SASSELECT*FROM學(xué)生 WHERE班級=‘21計算機學(xué)院’WITHCHECKOPTION;系統(tǒng)會自動檢查或者加上班級=’21計算機學(xué)院’的條件視圖創(chuàng)建【例7.56】定義學(xué)生姓名、修讀的課程名及成績的視圖。CREATEVIEWS_C_G(學(xué)號,姓名,課程名,成績)ASSELECT學(xué)生.學(xué)號,姓名,課程名,成績FROM學(xué)生,課程,選修WHERE學(xué)生.學(xué)號=選修.學(xué)號AND選修.課程號=課程.課程號;視圖撤銷DROPVIEW<視圖名>;【例7.57】撤銷已建立的一個視圖S_C_G。DROPVIEWS_C_G;查詢視圖【例7.58】用例7.55中定義的視圖CS21_S做查詢,查詢計算機系中的女學(xué)生。SELECT*FROMCS21_SWHERE性別=’女’;SELECT*FROM學(xué)生WHERE班級=’21計算機學(xué)院’
AND性別=’女’;查詢視圖【例7.59】在S_C_G視圖中查詢成績在85分以上的學(xué)生的學(xué)號、姓名和課程名稱。SELECT學(xué)號,姓名,課程名FROMS_C_GWHERE成績>=85;查詢視圖【例7.60】查詢21計算機學(xué)院所有學(xué)生的選課情況。SELECT*FROMCS21_SINNERJOIN選修USING(學(xué)號);本章小結(jié)SQL的數(shù)據(jù)定義SQL的數(shù)據(jù)查詢SQL的數(shù)據(jù)更新視圖的概念與作用感謝觀看!DatabaseTechnology&Applications數(shù)據(jù)庫技術(shù)及應(yīng)用數(shù)據(jù)庫完整性實施數(shù)據(jù)完整性的必要性正確性(correctness)數(shù)據(jù)語法的正確性如數(shù)值型數(shù)據(jù)中只能含有數(shù)字而不能含有字母有效性(valid)數(shù)據(jù)是否屬于所定義域的有效范圍如年齡不能是負數(shù),在0到150之間。相容性(consistency)同一事實的兩個數(shù)據(jù)應(yīng)當(dāng)一致如數(shù)據(jù)庫中同時有年齡和出生年份這兩個數(shù)據(jù),則年齡應(yīng)該等于當(dāng)前年份-出生年份防止各類錯誤數(shù)據(jù)進入數(shù)據(jù)庫!DBMS完整性控制的功能定義提供完整性約束條件的定義機制,確定要遵從的數(shù)據(jù)規(guī)則檢查檢查用戶發(fā)出的操作請求是否違背完整性約束條件處理如果發(fā)現(xiàn)用戶操作請求與完整性約束條件不符,需要采取一定的動作實體完整性規(guī)則的定義通過定義或者修改表結(jié)構(gòu)的時候定義PRIMARYKEY來實現(xiàn)。定義PRIMARYKEY的子句在CREATETABLE命令中的格式為:PRIMARYKEY(<列名序列>);//一個關(guān)系只能有一個PRIMARYKEY,鍵值非空且唯一實體完整性約束控制的實現(xiàn)【例8.1】新建學(xué)生S表(學(xué)號,姓名,年齡,身份證號),并定義實體完整性。CREATETABLES(SNOCHAR(8)PRIMARYKEY,/*在屬性列級別上定義主鍵*/SNameCHAR(10),Sageint,SecurityNOCHAR(18));實體完整性約束控制的實現(xiàn)【例8.1】新建學(xué)生S表(學(xué)號,姓名,年齡,身份證號),并定義實體完整性。CREATETABLES(SNOCHAR(8),SNameCHAR(10),Sageint,SecurityNOCHAR(18),PRIMARYKEY(SNO));/*在關(guān)系級別上定義主鍵*/實體完整性約束控制的實現(xiàn)【例8.2】新建課程C表(課程號,課程名,學(xué)分),并定義實體完整性。CREATETABLEC(CNOCHAR(8),CNameCHAR(10),HourNUMERIC(3),PRIMARYKEY(CNO));/*在關(guān)系級別上定義主鍵*/實體完整性約束控制的實現(xiàn)【例8.3】數(shù)據(jù)插入違反實體完整性而失敗的例子往S表插入兩條數(shù)據(jù):INSERTINTOSVALUES('S001','小明',19,’200006’);/*插入成功*/INSERTINTOSVALUES('S001','小紅',20,’300456’);/*插入失敗*/INSERTINTOSVALUES('S002','小紅',20,’300456’);/*插入成功*/UPDATESSETSNO='S001'WHERESNAME='小紅'/*更新失敗*/同樣學(xué)號的記錄已存在同樣學(xué)號的記錄已存在參照完整性規(guī)則的定義參照完整性(外鍵)定義的子句在CREATETABLE命令中一般格式為:FOREIGNKEY(<列名序列>)REFERENCES關(guān)系名<目標(biāo)關(guān)系名>|(<列名序列>)
[ONDELETE<ACTION>][ONUPDATE<ACTION>]違反參照完整性的處理方法操作對象相關(guān)操作INSERTDELETEUPDATE
被參照表不需要檢查根據(jù)參照表中外鍵定義的ONDELETE…(用戶顯示定義的方式,提供四種:CASCADE、NOACTION
、SETNULL和SETDEFAULT(系統(tǒng)默認的方式NOACTION)根據(jù)參照表中外鍵定義的ONUPDATE…(用戶顯示定義的方式,提供四種:CASCADE、NOACTION、SETNULL和SETDEFAULT(系統(tǒng)默認的方式NOACTION)參照表違反則拒絕執(zhí)行不需要檢查違反則拒絕執(zhí)行參照完整性約束控制的實現(xiàn)【例8.4】新建選修SC表(學(xué)號,課程號,成績),并定義實體完整性和參照完整性。建立選修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);參照完整性約束控制的實現(xiàn)【例8.4】新建選修SC表(學(xué)號,課程號,成績),并定義實體完整性和參照完整性。(1)往表中插入以下數(shù)據(jù)數(shù)據(jù):INSERTINTOSVALUES('A001','李紅',18);INSERTINTOSVALUES('A003','陳誠',18);INSERTINTOCVALUES('C001','C語言');INSERTINTOSCVALUES('A001','C001',95);INSERTINTOSCVALUES('A003','C001',85);參照完整性約束控制的實現(xiàn)【例8.4】新建選修SC表(學(xué)號,課程號,成績),并定義實體完整性和參照完整性。(2)往SC表(參照關(guān)系)中插入數(shù)據(jù):INSERTINTOSCVALUES('A001','C002',95);由于C表(被參照關(guān)系)中無課程C002,違反了參照完整性,所以C表的更新操作失敗,系統(tǒng)拒絕插入。參照完整性約束控制的實現(xiàn)【例8.4】新建選修SC表(學(xué)號,課程號,成績),并定義實體完整性和參照完整性。(3)更新SC表(參照關(guān)系)中學(xué)號為“A001”,課程號為“C001”的記錄:UPDATESCSETSNO='A002'WHERESNO='A001'ANDCNO='C001';由于S表中無學(xué)生“A002”,所以SC表的更新操作失敗,系統(tǒng)拒絕更新。參照完整性約束控制的實現(xiàn)【例8.4】新建選修SC表(學(xué)號,課程號,成績),并定義實體完整性和參照完整性。(4)更新S表(被參照關(guān)系)中學(xué)號為“A001”的記錄:UPDATESSETSNO='A002'WHERESNO='A001';在S表更新學(xué)生“A001”的學(xué)號時,在SC表中還存在著學(xué)生“A001”的選課信息,由于沒有定義外鍵SNO的更新操作,ONUPDATE子句默認為NOACTION,故系統(tǒng)拒絕更新。參照完整性約束控制的實現(xiàn)【例8.4】新建選修SC表(學(xué)號,課程號,成績),并定義實體完整性和參照完整性。(5)更新C表(被參照關(guān)系)中課程號為“C001”的記錄:UPDATECSETCNO='C002'WHERECNO='C001';在C表更新課程“C001”時,在SC表中還存在著課程“C001”的選課信息,且ONUPDATE子句中定義的是NOACTION,故系統(tǒng)拒絕更新。參照完整性約束控制的實現(xiàn)【例8.4】新建選修SC表(學(xué)號,課程號,成績),并定義實體完整性和參照完整性。(6)刪除S表(被參照關(guān)系)中學(xué)號為“A001”的記錄:DELETEFROMSWHERESNO='A001';在S表中刪除學(xué)生“A001”時,在SC表中還存在著學(xué)生“A001”的信息,所以S表的刪除操作違反了參照完整性。由于定義了外鍵SNO的刪除操作為CASCADE,所以系統(tǒng)除了刪除S表中學(xué)生“A001”的記錄之外,還會刪除SC表中學(xué)生“A001”選修的記錄。參照完整性約束控制的實現(xiàn)【例8.4】新建選修SC表(學(xué)號,課程號,成績),并定義實體完整性和參照完整性。(7)刪除C表(被參照關(guān)系)中課程號為“C001”的記錄:DELETEFROMCWHERECNO='C001';在C表刪除課程“C001”時,在SC表中還存在著課程“C001”的信息,所以C表的刪除操作違反了參照完整性。由于沒有定義外鍵CNO上的刪除操作,故默認為ONDELETENOACTION,所以系統(tǒng)拒絕刪除課程表記錄。用戶自定義完整性約束NOTNULL非空DEFAULT
默認值UNIQUE
唯一值CHECK
滿足表達式的取值用戶自定義完整性約束【例8.5】DEFAULT約束使用實例CREATETABLEEMPL(DnoNUMERIC(2),/*Dno為部門號*/EnoCHAR(8)UNIQUENOTNULL,/*屬性Eno取值唯一,而且不能為空*/SalaryNUMERIC(10)DEFAULT8000);/*屬性Salary具默認值約束*/用戶自定義完整性約束【例8.6】UNIQUE約束使用實例CREATETABLEDEPT(DEPNONUMERIC(2),DnameCHAR(8)UNIQUENOTNULL,/*Dname為候選鍵*/LocationCHAR(10),PRIMARYKEY(DEPNO));/*在關(guān)系級別上定義主鍵*/用戶自定義完整性約束【例8.7】CHECK約束使用實例——在S表關(guān)系中限定Gender只能取“male”或“female”:ALTERTABLESADDCOLUMNGenderCHAR(1)CHECK(GenderIN('M','F'));用戶自定義完整性約束【例8.8】CHECK約束使用實例——在S表中加入CHECK約束S1——限制學(xué)生年齡為18到25歲:ALTERTABLESADDCONSTRAINTS1CHECK(SageBETWEEN18AND25);數(shù)據(jù)庫安全性保護安全性控制的一般模型安全性保護的措施用戶身份鑒別基于訪問控制技術(shù)審計技術(shù)用戶身份鑒別【例8.9】在EMS數(shù)據(jù)庫內(nèi),添加、修改和刪除用戶的例子(1)創(chuàng)建用戶student1,密碼是student@123:CREATEUSERstudent1WITHPASSWORD"student@123";用戶身份鑒別【例8.9】在EMS數(shù)據(jù)庫內(nèi),添加、修改和刪除用戶的例子(2)將用戶student1的登錄密碼由student@123修改為abcd@123:ALTERUSERstudent1IDENTIFIEDBY'abcd@123'REPLACE'student@123';是系統(tǒng)提供的最外層安全保護措施,其方法是每個用戶在系統(tǒng)中必須有一個標(biāo)志自己身份的標(biāo)識符,用以和其它用戶相區(qū)別。用戶身份鑒別【例8.9】在EMS數(shù)據(jù)庫內(nèi),添加、修改和刪除用戶的例子(3)使用視圖PG_USER來查看當(dāng)前系統(tǒng)中的用戶列表:SELECT*FROMpg_user;用戶身份鑒別【例8.9】在EMS數(shù)據(jù)庫內(nèi),添加、修改和刪除用戶的例子(4)刪除用戶student1:DROPUSERstudent1CASCADE;基于訪問控制技術(shù)訪問控制(accesscontrol)就是一個數(shù)據(jù)庫用戶訪問數(shù)據(jù)庫資源權(quán)限的一種規(guī)定和管理。是數(shù)據(jù)庫安全保護的主體技術(shù)。數(shù)據(jù)庫用戶類型角色機制授權(quán)回收數(shù)據(jù)庫用戶類型數(shù)據(jù)庫用戶管理員用戶初始用戶系統(tǒng)管理員普通用戶數(shù)據(jù)庫用戶管理【例8.10】添加各類用戶的例子(1)在EMS數(shù)據(jù)庫內(nèi),創(chuàng)建系統(tǒng)管理員用戶admin,密碼為admin@123:CREATEUSERadminWITHSYSADMINPASSWORD"admin@123";數(shù)據(jù)庫用戶管理【例8.10】添加各類用戶的例子(2)創(chuàng)建普通用戶student1,密碼是student1@123:CREATEUSERstudent1WITHPASSWORD"student1@123";數(shù)據(jù)庫用戶管理【例8.10】添加各類用戶的例子(3)創(chuàng)建安全管理員security1,密碼是security1@123:CREATEUSERsecurity1WITHCREATEROLEPASSWORD"security1@123";數(shù)據(jù)庫用戶管理【例8.10】添加各類用戶的例子(4)使用視圖pg_user來查看當(dāng)前系統(tǒng)中的用戶列表:SELECT*FROMpg_user;數(shù)據(jù)庫用戶管理【例8.10】添加各類用戶的例子(5)使用視圖pg_roles來查看當(dāng)前系統(tǒng)中的角色列表:SELECT*FROMpg_roles;數(shù)據(jù)庫用戶管理【例8.10】添加各類用戶的例子(6)使用系統(tǒng)表pg_authid來查看用戶屬性:SELECT*FROMpg_authidWHERErolsystemadmin='t’;/*該用戶是管理員用戶*/SELECT*FROMpg_authidWHERErolcreaterole='t’;/*該用戶擁有創(chuàng)建角色權(quán)限*/數(shù)據(jù)庫用戶管理(7)刪除student1用戶:DROPUSERstudent1;角色機制角色(Role)是一類具有相同數(shù)據(jù)權(quán)限的用戶(User)的集合。角色機制角色創(chuàng)建:GRANTROLE<角色名>;角色授權(quán):GRANT<權(quán)限>[,<權(quán)限>]…ON<數(shù)據(jù)對象類型><數(shù)據(jù)對象名>TO<角色名>[,<角色>]…角色機制將角色授予其它用戶:GRANT<角色名>[,<角色>]…TO<用戶名>[,<用戶名>]…[WITHGRANTOPTION];將角色授予其它角色:GRANT<角色名1>TO<角色名2>;角色機制角色收回:REVOKE<權(quán)限>[,<權(quán)限>]…ON<數(shù)據(jù)對象類型><數(shù)據(jù)對象名>FROM<角色名>[,<角色>]…角色機制授權(quán)語句:GRANT{<權(quán)限1>,<權(quán)限2>…|ALL}[ON<數(shù)據(jù)對象類型><數(shù)據(jù)對象名>]TO{<用戶/角色>[,用戶/角色]…|PUBLIC}[WITHGRANTOPTION]/*表示獲得權(quán)限的用戶可以將其獲得的權(quán)限繼續(xù)授權(quán)給其它用戶*/授權(quán)語句【例8.11】使用角色機制完成將權(quán)限授予用戶,由此可以看到角色機制可以使自主授權(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)語句【例8.11】使用角色機制完成將權(quán)限授予用戶,由此可以看到角色機制可以使自主授權(quán)的執(zhí)行更加方便和靈活。(2)將對“學(xué)生”表的查詢、更新和插入權(quán)授予角色Teacher:GRANTSELECT,UPDATE,INSERTONTABLE學(xué)生TOTeacher;授權(quán)語句【例8.11】使用角色機制完成將權(quán)限授予用戶,由此可以看到角色機制可以使自主授權(quán)的執(zhí)行更加方便和靈活。(3)將具有上述權(quán)限的角色授予Raul,White和Mary:GRANTTeacherTORaul,White,Mary;授權(quán)語句【例8.11】使用角色機制完成將權(quán)限授予用戶,由此可以看到角色機制可以使自主授權(quán)的執(zhí)行更加方便和靈活。(4)將Teacher賦予White的權(quán)限收回:REVOKETeacherFROMWhite;授權(quán)語句【例8.11】使用角色機制完成將權(quán)限授予用戶,由此可以看到角色機制可以使自主授權(quán)的執(zhí)行更加方便和靈活。(5)增加Teacher在“學(xué)生”表上的DELETE權(quán)限:GRANTDELETEONTABLE學(xué)生TOTeacher;授權(quán)語句【例8.11】使用角色機制完成將權(quán)限授予用戶,由此可以看到角色機制可以使自主授權(quán)的執(zhí)行更加方便和靈活。(6)收回Teacher在“學(xué)生”表上的UPDATE權(quán)限:REVOKEUPDATEONTABLE學(xué)生FROMTeacher;授權(quán)語句【例8.12】將“學(xué)生”表的SELECT權(quán)力和對其中學(xué)號的UPDATE權(quán)授予用戶Tom,Lily:(1)創(chuàng)建用戶Tom,Lily:CREATEUSERTomWITHPASSWORD"Tom@1234";CREATEUSERLilyWITHPASSWORD"Lily@1234";授權(quán)語句【例8.12】將“學(xué)生”
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報參考:近代漢文中國行紀與全球文學(xué)關(guān)系研究
- 2025年度個人與公司租賃合同稅費承擔(dān)協(xié)議4篇
- 二零二五版金融服務(wù)保密協(xié)議范本修訂6篇
- 2025年保定怎么考貨運從業(yè)資格證
- 二零二五年城投小貸與農(nóng)業(yè)產(chǎn)業(yè)合作框架協(xié)議4篇
- 2025年度農(nóng)村土地流轉(zhuǎn)經(jīng)營權(quán)抵押貸款合同示范文本4篇
- 二零二五年度充電樁安裝工程知識產(chǎn)權(quán)保護合同4篇
- 二零二五年度出境領(lǐng)隊旅游目的地考察合同4篇
- 二零二五年度城市綜合體建設(shè)項目承包商安全作業(yè)管理協(xié)議4篇
- 2025年度葡萄采摘季節(jié)臨時工采購合同范本3篇
- 垃圾處理廠工程施工組織設(shè)計
- 天皰瘡患者護理
- 2025年蛇年新年金蛇賀歲金蛇狂舞春添彩玉樹臨風(fēng)福滿門模板
- 《建筑制圖及陰影透視(第2版)》課件 4-直線的投影
- 2024-2030年中國IVD(體外診斷)測試行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 損失補償申請書范文
- 壓力與浮力的原理解析
- 鐵路損傷圖譜PDF
- 裝修家庭風(fēng)水學(xué)入門基礎(chǔ)
- 移動商務(wù)內(nèi)容運營(吳洪貴)任務(wù)二 社群的種類與維護
- 《詩詞寫作常識 詩詞中國普及讀物 》讀書筆記思維導(dǎo)圖
評論
0/150
提交評論