数据库技术课件_第1页
数据库技术课件_第2页
数据库技术课件_第3页
数据库技术课件_第4页
数据库技术课件_第5页
已阅读5页,还剩263页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1

關係模型

23.1關係資料庫的結構

3.1.1關係模型關係模型就是用二維表格結構來表示實體及實體之間聯繫的模型。即關係模型是一些表格的格式,其中包括關係名、屬性名、關鍵字等。例如,教學資料庫中教師與課程的關係模型如圖3.1所示。教師關係TTNO教師號TN姓名SEX性別AGE年齡PROF職稱SAL工資COMM崗位津貼DEPT系別3

課程關係C

授課關係SC圖3.1教師—課程資料庫的關係模型從各個關係的框架中,我們可以很容易看出哪兩個關係之間有聯繫。例如:教師關係和授課關係有公共的屬性“教師號”,則表明這兩個關係有聯繫。而課程關係和授課關係有公共的屬性“課程號”,則表明這兩個關係也有聯繫。CNO課程號CN課程名CT課時

TNO教師號CNO課程號43.1.2關係的定義1、域(Domain)域是一組具有相同數據類型的值的集合,又稱為值域(用D表示)

。關係中用域表示屬性的取值範圍。例如整數、實數、字串的集合。域中所包含的值的個數稱為域的基數(用m表示)。例如:D1={李力,王平,劉偉} m1=3 D2={男,女} m2=2 D3={47,28,30} m3=3 其中,D1,D2,D3為功能變數名稱,分別表示教師關係中姓名、性別、年齡的集合。52、笛卡爾積(CartesianProduct)給定一組域D1,D2,…,Dn(它們可以包含相同的元素,即可以完全不同,也可以部分或全部相同)。D1,D2,…,Dn的笛卡爾積為D1×D2×……×Dn={(d1,d2,…,dn)|di∈Di,i=1,2,…,n}。由定義可以看出,笛卡爾積也是一個集合。其中:元素中的每一個di叫做一個分量(Component),來自相應的域(di∈Di)每一個元素(d1,d2,d3,…,dn)叫做一個n元組(n-tuple),簡稱元組(Tuple)。但元組不是di的集合,元組的每個分量(di)是按序排列的。如:(1,2,3)≠(2,3,1)≠(1,3,2)。

6Di中的集合元素個數稱為Di的基數,用mi(i=1,2,……n)表示,則笛卡爾積D1×D2×……×Dn的基數M(即元素(d1,d2,……dn)的個數)為所有域的基數的累乘之積,即

M=例如:上述表示教師關係中姓名、性別兩個域的笛卡爾積為:D1×D2={(李力,男),(李力,女),(王平,男),(王平,女),(劉偉,男),(劉偉,女)}其中:(李力,男),(李力,女)等是元組其基數M=m1×m2=3*2=6元組的個數為67笛卡爾積可用二維表的形式表示。例如,上述的6個元組可表示成表3.2。表3.2D1和D2的笛卡爾積由上例可以看出,笛卡爾積實際是一個二維表,表的框架由域構成,表的任意一行就是一個元組,表中的每一列來自同一域,如第一個分量來自D1,第二個分量來自D2。姓名性別李力男李力女王平男王平女劉偉男劉偉女83、關係(Relation)笛卡爾積D1×D2×…×Dn的任一子集稱為定義在域D1,D2,…Dn上的n元關係(Relation),可用R(D1,D2……Dn)表示如上例D1×D2笛卡爾積的子集可以構成教師關係T1,如下表:

表3.3教師關係T1姓名性別李力男王平女劉偉男9幾點說明:

R為關係名,n稱為關係的目或度(Degree)。當n=1時,稱為單元關係,當n=2時,稱為二元關係。…當n=n時,稱為n元關係。如上例為二元關係,關係名為T1。數學上關係是笛卡爾積的任意子集,但在實際應用中關係是笛卡爾積中所取的有意義的子集。例如在表3.2中選取一個子集構成如下關係,顯然不符合實際情況姓名性別李力男李力女表3.4不符合實際意義的關係10儘管關係與二維表格是非常類似的,但它們之間又有重要的區別。關係具有如下特性:1.關係中不允許出現相同的元組。2.關係中元組的順序(即行序)是無關緊要的,在一個關係中可以任意交換兩行的次序。關係中屬性的順序是無關緊要的,即列的順序可以任意交換。交換時,應連同屬性名一起交換,否則將得到不同的關係。4.同一屬性名下的各個屬性值必須來自同一個域,是同一類型的數據。5.關係中各個屬性必須有不同的名字,不同的屬性可來自同一個域。3.1.3關係的性質11

例如,有如下表中關係,職業與兼職是兩個不同的屬性,但它們取自同一個域,職業={教師,工人,輔導員}。姓名職業兼職張強教師輔導員王麗工人教師劉寧教師輔導員表3.5關係126.關係中每一分量必須是不可分的資料項目,或者說所有屬性值都是原子的,即是一個確定的值,而不是值的集合。滿足此條件的關係稱為規範化關係,否則稱為非規範化關係。例如,在表3.6中,籍貫含有省、市/縣兩項,出現了“表中有表”的現象,則為非規範化關係,而把籍貫分成省、市/縣兩列,將其規範化,如表3.7所示。 表3.6表3.7姓名籍貫

姓名省市/縣省市/縣

張強吉林長春

張強吉林長春王麗山西大同

王麗山西大同13候選鍵與關係鍵主屬性與非碼屬性主屬性:包含在主碼中的的各屬性稱為主屬性。非碼屬性:不包含在任何候選碼中的屬性稱為非碼屬性。在最簡單的情況下,一個候選碼只包含一個屬性,如學生關係中的“學號”,教師關係中的“教師號”。在最極終端的情況下,所有屬性的組合是關係的候選碼,這時稱為全碼(all-key)。3.1.4關係的鍵

14外部關係鍵如果關係R2的一個或一組屬性X不是R2的主碼,而是另一關係R1的主碼,則該屬性或屬性組X稱為關係R2的外部關係鍵或外碼(Foreignkey)。並稱關係R2為參照關係,關係R1為被參照關係。例如學生(學號,姓名,系名),系(系名,地址,系主任),則屬性“系名”為學生關係模式的外碼,稱學生為參照關係,系為被參照關係。153.2關係代數

關係代數的運算對象是關係,運算結果也是關係,關係代數用到的運算符主要包括四類:集合運算符:∪(並),∩(交),-(差),X(廣義笛卡爾積);專門的關係運算符:σ(選擇),∏(投影),∞(連接),*(自然連接),÷(除);算術比較運算符:>(大於),≥(大於等於),<(小於),≤(小於等於),=(等於),≠(不等於);邏輯運算符:∧(與),∨(或),┐(非)16關係代數的運算按運算對象的不同主要分為兩類:傳統的集合運算:把關系看成元組的集合,以元組作為集合中元素來進行運算,其運算是從關係的“水準”方向即行的角度進行的。包括並、差、交和笛卡爾積等運算。專門的關係運算:不僅涉及行運算,也涉及列運算,這種運算是為數據庫的應用而引進的特殊運算。包括選取、投影、連接和除法等運算。同時,根據運算對象的個數還可以分為:一元運算:只對一個關係進行運算。例如:選取、投影、命名運算。二元運算:對兩個關係進行運算。例如:並、差、交和笛卡爾積等運算173.2.1傳統的集合運算1.並(Union)關係R和關係S的並由屬於R或屬於S的元組組成,即R和S的所有元組合並,刪去重複元組,組成一個新關係,其結果仍為n目關係。記作:

R∪S={t|t∈R∨t∈S}對於關係資料庫,記錄的插入和添加可通過並運算實現。2.差(Difference)關係R與關係S的差由屬於R而不屬於S的所有元組組成,即R中刪去與S中相同的元組,組成一個新關係,其結果仍為n目關係。記作:

R-S={t|t∈R∧┐t∈S}通過差運算,可實現關係資料庫記錄的刪除。183.交(Intersection)關係R與關係S的交由既屬於R又屬於S的元組組成,即R與S中相同的元組,組成一個新關係,其結果仍為n目關係。記作:

R∩S={t|t∈R∧t∈S}如果兩個關係沒有相同的元組,那麼它們的交為空。兩個關係的並和差運算為基本運算(即不能用其他運算表達的運算),而交運算為非基本運算,交運算可以用差運算來表示:

R∩S=R-(R-S)194.廣義笛卡爾積(ExtendedCartesianProduct)兩個分別為n目和m目關係R和S的廣義笛卡爾積是一個(n+m)列的元組的集合,元組的前n列是關係R的一個元組,後m列是關係S的一個元組。若R有k1個元組,S有k2個元組,則關係R和關係S的廣義笛卡爾積有k1*k2個元組,記作

R×S={tr⌒ts|tr∈R,∧ts∈S}關係的廣義笛卡爾積可用於兩關係的連接操作(連接操作將在一節仲介紹)來實現。20【例3.1】如圖3.8(a)、(b)所示的兩個關係R與S為相容關係,(c)為R與S

的並,(d)為R與S的交,(e)為R與S的差,(f)為R與S的廣義笛卡爾積。

RS (a)(b)

ABC

ABCa1b1c1

a1b1c1a1b1c2

a2b2c1a2b2c1

a2b3c221 R∪SR-S (c)(d)R∩S

(e)ABC

ABCa1B1c1

a1b1c2a1B1c2

a2B2c1

a2B3c2

ABCa1B1c1a2B2c122R×S

ABCABCa1b1c1a1b1c1a1b1c1a2b2c1a1b1c1a2b3c2a1b1c2a1b1c1a1b1c2a2b2c1a1b1c2a2b3c2a2b2c1a1b1c1a2b2c1a2b2c1a2b2c1a2b3c2

(f)圖3.8傳統的集合運算

233.2.2專門的關係運算由於傳統的集合運算,只是從行的角度進行,但是要靈活地實現關係資料庫多樣的查詢操作,就必須引入專門的關係運算。引入幾個概念:

(1)設關係模式為R(A1,A2,……An),它的一個關係為R,t∈R表示t是R的一個元組,t[Ai]則表示元組t中相應於屬性Ai的一個分量。24(2)R為n目關係,S為m目關係,tr∈R,ts∈S,trts稱為元組的連接,它是一個n+m列的元組,前n個分量為R的一個n元組,後m個分量為S中的一個m元組。(3)給定一個關係R(X,Z),X和Z為屬性組,定義當t[X]=x時,x在R中的象集為Zx={t[Z]|t∈R,t[X]=x},它表示R中的屬性組X上值為x的諸元組在Z上分量的集合。

251.選擇(Selection)選擇運算是單目運算,是根據一定的條件在給定的關係R中選取若干個元組,組成一個新關係,記作:σF(R)={t|t∈R∧F(t)為真}其中,σ為選取運算符,F為選取的條件,它由運算對象(屬性名、常數、簡單函數)、算術比較運算符(>,≥,<,≤,=,≠)和邏輯運算符(∨∧┐)連接起來的邏輯運算式,結果為邏輯值“真”或“假”。選取運算實際上是從關係R中選取使邏輯運算式為真的元組,是從行的角度進行的運算。26例3.2查詢電腦系的全體學生。σdepartment_name=“電腦系”(student)或σ3=’電腦系’(student)(其中3為department_name的屬性序號)結果教材P53圖3.9所示。例3.3查詢學號大於“s000004”的學生資訊。σstudent_number>“s000004”(student)例3.4查詢電腦系的查詢學號大於“s000004”的學生資訊。σdepartment_name=“電腦系”∧

student_number>”s000004”

(student)272.投影(Projection)投影運算也是單目運算,關係R上的投影是從R中選擇出若干屬性列,組成新的關係,即對關係在垂直方向進行的運算,從左到右按照指定的若干屬性及順序取出相應列,刪去重複元組。記作:ΠA(R)={t[A]|t∈R}其中A為R中的屬性列,Π為投影運算符。從其定義可看出,投影運算是從列的角度進行的運算,這正是選取運算和投影運算的區別所在。選取運算是從關係的水準方向上進行運算的,而投影運算則是從關係的垂直方向上進行的。

28例3.5查詢學生的學號及姓名。Πstudent_number

,student_name(student)或Π1,2(student)結果如教材P54圖3.10圖所示。例3.6查詢出電腦系的學生姓名。Πstudent_name(σdepartment_name=“電腦系”(student))Student_name馮藹妍陳國國29由例3.6可以看出,投影後取消了某些屬性列後,就可能出現重複行,應該取消這些完全相同的行。所以投影之後,不但減少了屬性,元組也可能減少。

30課堂練習3.2:下圖給出了教學資料庫的關係模型及其實例,包含五個關係:教師關係T、學生關係S、課程關係C、選課關係SC和授課關係TC,分別對應五張表,請完成以下操作:查詢電腦系的全體學生;查詢工資高於1000元的男教師;查詢教師的姓名及其職稱;查詢教師關係中有哪些系;查詢講授C5課程的教師號。31T(教師表)TNO教師號TN姓名SEX性別AGE年齡PROF職稱SAL工資COMM崗位津貼DEPT系別T1李力男47教授15003000電腦T2王平女28講師8001200資訊T3劉偉男30講師9001200電腦T4張雪女51教授16003000自動化T5張蘭女39副教授13002000資訊32S(學生表)SNO學號SN姓名SEX性別AGE年齡DEPT系別S1趙亦女17電腦S2錢爾男18資訊S3孫珊女20資訊S4李思男21自動化S5周武男19電腦S6吳麗女20自動化33C(課程表)CNO課程號CN課程名CT課時C1程式設計60C2微機原理80C3數字邏輯60C4數據結構80C5資料庫60C6編譯原理60C7操作系統6034SC(選課表)TC(授課表)

SNO學號CNO課程號SCORE成績

TNO教師號CNO課程號S1C190

T1C1S1C285

T1C4S2C557

T2C5S2C680

T3C1S2C7

T3C5S2C570

T4C2S3C10

T4C3S3C270

T5C5S3C485

T5C7S4C193

S4C285

S4C383

S5C289

35課堂練習答案:查詢電腦系的全體學生。σDEPT=’電腦’(S)或σ5=’電腦’(S)(其中5為DEPT的屬性序號)結果如圖所示。SNOSNSEXAGEDEPTS1趙亦女17電腦S5周武男19電腦36查詢工資高於1000元的男教師。σ(SAL>1000)∧(SEX=’男’)(T)結果如圖所示。

注意:字元型數據的值應該使用單引號括起來,例如,‘電腦’,‘男’。

TNOTNSEXAGEPROFSALCOMMDEPTT1李力男47教授15003000電腦37查詢教師的姓名及其職稱。ΠTN,TNO,PROF(T)或Π2,1,5(T)(其中2,1,5分別為TN、TNO和PROF的屬性序號)結果右圖所示

上例表明,投影運算可以改變關係的屬性次序

TNTNOPROF李力T1教授王平T2講師劉偉T3講師張雪T4教授張蘭T5副教授38查詢教師關係中有哪些系。ΠDEPT(T)結果如右圖所示

由上例可以看出,投影後取消了某些屬性列後,就可能出現重複行,應該取消這些完全相同的行。所以投影之後,不但減少了屬性,元組也可能減少,新關係與原關係不相容。

DEPT電腦資訊自動化39查詢講授C5課程的教師號。ΠTNO(σCNO=’C5’(TC))結果如右圖所示。

本例中選取運算和投影運算相結合,先在授課表中選取滿足條件的元組,再於TNO屬性上進行投影。

TNOT2T3T540第3章

關係模型(2)413.自然連接(Join)自然連接是在廣義笛卡爾積R×S中選出同名屬性上符合相等條件元組,再進行投影,去掉重複的同名屬性,組成新的關係。即如果R與S具有相同的屬性組Y,則自然連接可記作:R∞S={tr⌒ts|tr∈R∧ts∈S∧tr[Y]=ts[Y]}42R∞S(c)

圖3.10自然連接運算舉例

ABCDa1b125a1b246a2b367a2b367434.除法(Division)定義:象集(imageset)給定一個關係R(X,Z),X和Z為屬性組,定義當t[X]=x時,x在R中的象集為Zx,其中Zx={t[Z]|t∈R,t[X]=x}。象集Zx表示R中的屬性組X上值為x的諸元組在Z上分量的集合。例如下圖11所示的關係R:44ABCa1b1c2a2b3c7a3b4c6a1b2c3a4b6c6a2b2c3a1b2c1圖3.11關係R屬性A的值域為{a1,a2,a3,a4}其中:a1的象集為{(b1,c1),(b2,c3),b2,c1}a2象集為{(b3,c7),(b2,c3)}a3象集為{(b4,c6)}45除法運算是二目運算,設有關係R(X,Y)與關係S(Y,Z),其中X,Y,Z為屬性集合,關係R除以關係S所得的商是一個新關係P(X),P是R中滿足下列條件的元組在X上的投影:元組在X上分量值x的象集Yx包含S在Y上投影的集合。記作:R÷S={tr[X]|tr∈R∧Πy(S)

Yx}其中,Yx為x在R中的象集,x=tr[X]。除法運算為非基本運算,可以表示為:R÷S=Πx(R)-Πx(Πx(R)×S-R)46例3.8已知關係R和S,如圖3.12(a),(b)所示,則R÷S如圖(c)所示。與除法的定義相對應,本題中

X={A}={a1,a2,a3,a4,},Y={B,C}={(b1,c2),(b3,c7),(b4,c6),(b2,c3),(b6,c6),(b2,c1)}Z={D}={d1,d2}。其中,關係R中的元組在X上各個分量值的象集分別為: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)上的投影,所以R÷S={a1}47RSR÷S

(a)(b)(c)

圖3.12ABCa1b1c2a2b3c7a3b4c6a1b2c3a4b6c6a2b2c3a1b2c1BCDb1c2d1b2c1d1b2c3d2Aa148除法運算同時從行和列的角度進行運算,適合於包含“部”之類的短語的查詢。例3.12查詢例表3.13所示關係中選修了全部課程的學生學號。C(課程表)SC(選課表)CNOCNc1資料庫c2操作系統c3數據結構c4微機原理SNOCNOSCOREs1c190s1c480s2c160s2c290s2c370s2c355s3c270s4c155s4c275s4c390s4c460圖3.13課程及選課關係圖49ΠSNO,CNO(SC)÷ΠCNO(C)={s4}例3.13查詢例表3.13所示關係中至少選修了c1和c3課程的學生學號。50關係演算是以數理邏輯中的謂詞演算為基礎的,通過謂詞形式來表示查詢運算式。根據謂詞變元的不同,可將關係演算分為元組關係演算和域關係演算。3.3.1元組關係演算元組關係演算是以元組變數作為謂詞變元的基本對象。其查詢運算式為:{t∣P(t)}3.3.1元組關係演算域關係演算是以域變數作為謂詞變元的基本對象。其查詢運算式為:{<x1,x2,…,x3>∣P(x1,x2,…,x3)}3.3關係演算513.4.1廣義投影3.4.2外連接左外連接右外連接全外連接3.4.3聚集函數3.4擴展關係代數運算523.5.1刪除元組

r←r-E3.5.2插入元組

r←r∪E

3.4.3更新已有元組的屬性

r←∏F1,F2,…,Fn(r)3.5資料庫的修改534.1背景4.1.1SQL語言的起源1975年由CHAMBERLIN和BOYEE提出,當時稱為SEQUEL(STUCTUREDENGLISHQUERYLANGUAGE);1981年IBM推出其商用關係關係資料庫SQL/DS;今天廣泛應用於各種大型資料庫,如SYBASE、INFORMIX、ORACLE、DB2、INGRES等,也用於各種小型資料庫,如FOXPRO、ACCESS。544.1.2SQL語言標準化1.1986年,美國國家標準化協會公佈了SQL語言的第一個標準SQL86;2.1987年,ISO通過了SQL86標準;3.1989年,ISO推出了SQL89標準;4.1992年,ISO推出了SQL92標準;5.目前SQL99(也稱為SQL3)在起草中,增加了面向對象的功能。554.1.3SQL語言的主要特點SQL語言類似於自然語言,簡潔易用;SQL語言是一種非過程語言;SQL語言是一種面向集合的語言;SQL語言既是自含式語言,又是嵌入式語言;SQL語言具有:數據查詢數據定義數據操縱數據控制四種語言一體化的功能。564.1.4SQL語言的基本概念基本表(BASETABLE):是獨立存在的表,不是由其他的表導出的表。一個關係對應一個基本表,一個或多個基本表對應一個存儲檔。視圖(VIEW):是一個虛擬的表,是從一個或幾個基本表導出的表。它本身不獨立存在於資料庫中,資料庫中只存放視圖的定義而不存放視圖對應的數據,這些數據仍存放在導出視圖的基本表中。當基本表中的數據發生變化時,從視圖中查詢出來的數據也隨之改變。574.2SQL數據定義

4.2.1字段數據類型SQL語言使用數據定義語言(簡稱DDL)實現其數據定功能,可對數據庫用戶、基本表、視圖、索引進行定義和撤銷。字段類型的定義和具體的DBMS有關,因此具體定義只能從有關的DBMS手冊中得到。教材P92列出了SQL-92支持的數據類型。584.2.2創建、修改和刪除數據表4.2.2.1創建數據表

創建一個數據表時主要包括以下幾個組成部分:(1)字段名(2)字段數據類型(3)字段的長度、精度和小數位數;2、創建數據表的SQL語法格式為:

CREATETABLE表名(列名1數據類型1[NOTNULL][,列名2數據類型2[NOTNULL]]…)59例4.1建立一學生表SCREATETABLES(SNOCHAR(8),SNVARCHAR(20),AGEINT,SEXCHAR(2)DEFAULT'男',DEPTVARCHAR(20))執行該語句後,便產生了學生基本表的表框架,此表為一個空表。其中,SEX列的缺省值為“男”。603.定義完整性約束還可以對表進一步定義,如主鍵、空值的設定。在SQLSERVER中可以定義五種類型的完整性約束,下麵分別加以介紹:NULL/NOTNULLUNIQUE約束

UNIQUE約束用於指明基本表在某一列或多個列的組合上的取值必須唯一。PRIMARYKEY約束

PRIMARYKEY約束用於定義基本表的主鍵,起唯一標識作用,其值不能為NULL,也不能重複,以此來保證實體的完整性。61FOREIGNKEY約束

FOREIGNKEY約束指定某一個列或一組列作為外部鍵,其中,包含外部鍵的表稱為從表,包含外部鍵所引用的主鍵或唯一鍵的表稱主表。CHECK約束

CHECK約束用來檢查字段值所允許的範圍,以此來保證域的完整性。62例4.2建立包含完整性定義的學生表CREATETABLES(SNOCHAR(6)CONSTRAINTS_PRIMPRIMARYKEY,SNCHAR(8)CONSTRAINTSN_CONSNOTNULL,AGENUMERIC(2)CONSTRAINTAGE_CONSNOTNULLCONSTRAINTAGE_CHKCHECK(AGEBETWEEN15AND50),SEXCHAR(2)DEFAULT'男',DEPTCHAR(10)CONSTRAINTDEPT_CONSNOTNULL);634.2.2.2修改基本表1.為已有的基本增加新列用於增加新列和完整性約束,定義方式同CREATETABLE語句中的定義方式相同,其語法格式為:

ALTERTABLE表名ADD<列定義>|<完整性約束定義>例4.3在S表中增加一個班號列和住址列。ALTERTABLESADDCLASS_NOCHAR(6),ADDRESSCHAR(40)注意:使用此方式增加的新列自動填充NULL值,所以不能為增加的新列指定NOTNULL約束。642.從基本表中刪除某些屬性(列)其語法格式為:

ALTERTABLE表名DROP列名例4.4刪除S表中的AGE列ALTERTABLESDROPAGE653刪除基本表刪除後,該表中的數據和在此表上所建的索引都被刪除,而建立在該表上的視圖不會隨之刪除,系統將繼續保留其定義,但已無法使用。刪除表的語法格式:

DROPTABLE<表名>例4.5刪除表SDROPTABLES664.2.3索引4.2.3.1索引的作用索引是資料庫隨機檢索的常用手段,它實際上就是記錄的關鍵字與其相應地址的對應表。此外在SQL中,行的唯一性也是通過建立唯一索引來維護的。索引的作用可歸納為:1.加快查詢速度;2.保證行的唯一性。674.2.3.2建立索引建立索引的語句是CREATEINDEX,其語法格式為:CREATE[UNIQUE]INDEX<索引名>ON<表名>(<列名1>[ASC/DESC][{,<列名2>}][ASC/DESC]…)UNIQUE表明建立唯一索引。次序用來指定索引值的排列順序,可為ASC(昇冪)或DESC(降序),缺省值為ASC。68例4.6為S表在SNO上建立唯一索引IP。CREATEUNIQUEINDEXISNOONS(SNO)執行此命令後,為S表建立一個索引名為IP的唯一索引,此索引為SNO的唯一索引,即對S表中的行先按SNO的遞增順序索引。由於有UNIQUE的限制,所以該索引在SNO列的排序上具有唯一性,不存在重複值。69注意:改變表中的數據(如增加或刪除記錄)時,索引將自動更新。索引建立後,在查詢使用該列時,系統將自動使用索引進行查詢。索引數目無限制,但索引越多,更新數據的速度越慢。對於僅用於查詢的表可多建索引,對於數據更新頻繁的表則應少建索引。704.2.3.3刪除索引刪除索引的語句是DROPINDEX,其語法格式為:

DROPINDEX索引名ON數據表名例4.7刪除表S的索引ISNO。

DROPINDEXISNOONS714.3SQL數據查詢4.3.1SELECT命令的格式與基本使用SQL語言提供SELECT語句,通過查詢操作可得到所需的資訊。SELECT語句的常用格式:SELECT [ALL/DISTINCT]*/選擇列表FROM基表名[WHERE條件運算式][GROUPBY列名1[HAVING<條件運算式>]][ORDERBY列名2[ASC|DESC]];72SELECT語句的執行過程是:根據WHERE子句的檢索條件,從FROM子句指定的基本表或視圖中選取滿足條件的元組,再按照SELECT子句中指定的列,投影得到結果表。如果有GROUP子句,則將查詢結果按照<列名1>相同的值進行分組。如果GROUP子句後有HAVING短語,則只輸出滿足HAVING條件的元組。如果有ORDER子句,查詢結果還要按照<列名2>的值進行排序。73例4.7查詢Q表中的所有供應者號。

SELECTDISTINCTSNOFROMQ查詢結果中的重複行被去掉例4.8查詢供應商的全部資訊。

SELECT*FROMS

用’*’表示S表的全部列名,而不必逐一列出。

上述查詢均為不使用WHERE子句的無條件查詢,也稱作投影查詢。另外,利用投影查詢可控制列名的順序。見下例4.9:例4.9查詢全體供應商的姓名、編號和地址。

SELECTSNAME,SNO,ADDRFROMS744.3.2條件查詢當要在表中找出滿足某些條件的行時,則需使用WHERE子句指定查詢條件。WHERE子句中,條件通常通過三部分來描述:

列名;比較運算符;列名、常數。常用的比較運算符見下表4.2所示75表4.2常用的比較運算符查詢條件謂詞比較=,>,<,>=,<=,<>,確定範圍BETWEENAND,NOTBETWEENAND確定集合IN,NOTIN字元匹配LIKE,NOTLIKE空值ISNULL,ISNOTNULL多重條件AND,OR764.3.2.1比較大小例4.11查詢出SNO為52的供應者資訊。SELECT*FROMSWHERESNO=52例4.12查詢庫存量小於100的零件。SELECT*FROMPWHEREQUTY<100774.3.2.2多重條件查詢當WHERE子句需要指定一個以上的查詢條件時,則需要使用邏輯運算符AND、OR或NOT將其連結成複合的邏輯運算式。其優先順序由高到低為:NOT、AND、OR,用戶可以使用括弧改變優先順序。例4.13查詢供應101號或102號零件且供貨量大於50的供應商的編號。SELECTSNOFROMQWHERE((PNO=101ORPNO=102)AND(DELIQUTY>50))784.3.2.3確定範圍例4.14查詢供應時間在5至10天之間的零件號、供應者號及供應時間,並按時間排序。SELECTPNO,SNO,D_TIMEFROMQWHERE(D_TIMEBETWEEN5AND10)ORDERBYD_TIME等價於SELECTPNO,SNO,D_TIMEFROMQWHERED_TIME>=5ANDD_TIME<=10ORDERBYD_TIME794.3.2.4確定集合利用“IN”操作可以查詢屬性值屬於指定集合的元組。例4.15

查詢‘BOLT’、‘CAM’、‘BELT’的庫存量。SELECTPNO,PNAME,QUTYFROMPWHEREPNAMEIN('BOLT','CAM','BELT')此語句也可以使用邏輯運算符“OR”實現。SELECTPNO,PNAME,QUTYFROMPWHERE(PNAME='BOLT'ORPNAME='CAM'ORPNAME='BELT')804.3.2.5部分匹配查詢上例均屬於完全匹配查詢,當不知道完全精確的値時,用戶還可以使用LIKE或NOTLIKE進行部分匹配查詢(也稱模糊查詢)。LIKE定義的一般格式為:

<屬性名>LIKE<字串常量>屬性名必須為字元型,字串常量的字元可以包含如下兩個特殊符號:*:表示任意長度的字串;?:表示任意單個字元。例4.16查詢所有姓名第一個字母為“X”的供應商的編號和姓名。SELECTSNO,SNAMEFROMSWHERESNAMELIKE'X*'814.3.2.6

空值查詢某個字段沒有值稱之為具有空值(NULL)。例4.17查詢沒有考試成績的學生的學號和相應的課程號。SELECTSNO,CNOFROMSCWHERESCOREISNULL注意:這裏的空值條件為ISNULL,不能寫成SCORE=NULL。824.3.3

常用庫函數及統計匯總查詢SQL提供了許多庫函數,增強了基本檢索能力。常用的庫函數,如表4.3所示:函數名稱功能AVG按列計算平均值SUM按列計算值的總和MAX求一列中的最大值MIN求一列中的最小值COUNT按列值計個數表4.3常用庫函數83例4.18檢索PNO為101的零件的平均供貨時間。SELECT‘PNO101’,AVG(D_TIME)FROMQWHEREPNO=101注意:函數SUM和AVG只能對數值型字段進行計算。例4.19求計地址為“beijing”的供應商的總數。SELECTCOUNT(SNO)FROMSWHEREADDR='beijing‘例4.20利用特殊函數COUNT(*)求計地址為“beijing”的供應商的總數。

SELECTCOUNT(*)FROMSWHEREADDR=‘beijing’COUNT(*)用來統計元組的個數要消除重複行時可使用DISTINCT關鍵字

844.3.4分組查詢GROUPBY子句可以將查詢結果按屬性列或屬性列組合在行的方向上進行分組,每組在屬性列或屬性列組合上具有相同的值。例4.21檢索所有零件的最高最低價格,並按零件號排序。SELECTPNO,MIN(PRICE)ASPRICEOFMINS,MAX(PRICE)ASPRICEOFMAXFROMQGROUPBYPNOORDERBYPNOGROUPBY子句按PNO的值分組,所有具有相同PNO的元組為一組,對每一組使用函數MAX和MIN分別進行計算出各種零件的最低及最高價格。85若在分組後還要按照一定的條件進行篩選,則需使用HAVING子句。例4.22

查詢有多於一種價格的零件的最、最高價。SELECTPNO,MIN(PRICE)ASPRICEOFMINS,MAX(PRICE)ASPRICEOFMAXFROMQGROUPBYPNOHAVINGCOUNT(*)>1ORDERBYPNOGROUPBY子句按PNO的值分組,所有具有相同PNO的元組為一組,對每一組使用函數COUNT進行計算,統計出一組中的商品條數。HAVING子句去掉不滿足COUNT(*)>1的組。864.3.5數據表連接及連接查詢數據表之間的聯繫是通過表的字段值來體現的,這種字段稱為連接字段。連接操作的目的就是通過加在連接字段的條件將多個表連接起來,以便從多個表中查詢數據。前面的查詢都是針對一個表進行的,當查詢同時涉及兩個以上的表時,稱為連接查詢。表的連接方法有兩種:方法1:表之間滿足一定的條件的行進行連接,此時FROM子句中指明進行連接的表名,WHERE子句指明連接的列名及其連接條件。方法2:利用關鍵字JOIN進行連接。87具體分為以下幾種:INNERJOIN

:顯示符合條件的記錄,此為默認值;LEFT(OUTER)JOIN:顯示符合條件的數據行以及左邊表中不符合條件的數據行,此時右邊數據行會以NULL來顯示,此稱為左連接;RIGHT(OUTER)JOIN:顯示符合條件的數據行以及右邊表中不符合條件的數據行,此時左邊數據行會以NULL來顯示,此稱為右連接;CROSSJOIN:會將一個表的每一筆數據和另一表的每筆數據匹配成新的數據行。此稱為廣義笛卡爾積;當把JOIN關鍵字放於FROM子句中時,應有關鍵字ON與之相對應,以表明連接的條件。884.3.5.1等值連接與非等值連接例4.23檢索出供應者號為51的供應者所供應的所有零件的零件號、零件名、零件價格。方法1:SELECTP.PNO,P.PNAME,Q.PRICEFROMP,QWHERE(P.PNO=Q.PNOANDQ.SNO=51)這裏SNO=51為查詢條件,而P.PNO=Q.PNO為連接條件,

PNO為連接字段。89連接條件的一般格式為:

[<表名1>.]<列名1><比較運算符>[<表名2>.]<列名2>

方法2:SELECTP.PNO,P.PNAME,Q.PRICEFROM(PINNERJOINQONP.PNO=Q.PNO)WHEREQ.SNO=5190例4.24

檢索供應者‘kehai’供應的零件細目。SELECTS.SNAME,Q.PNO,P.PNAME,Q.PRICE,Q.D_TIMEFROM((PINNERJOINQONP.PNO=Q.PNO)INNERJOINSONQ.SNO=S.SNO)WHERE(S.SNAME='kehai')本例涉及三個表,稱為多表連接。914.3.5.2

自身連接當一個表與其自已進行連接操作時,稱為表的自身連接。例4.25

查詢能同時供應207或215零件的供應商號。要查詢的內容均在同一表Q中,可以將表Q分別取兩個別名,一個是QA,一個是QB。將QA,QB中滿足QA.PNO=207且QB.PNO=215的行連接起來。然後從中選擇出QA.SNO=QB.SNPO的元組。這實際上是同一表Q的自身連接。SELECTQA.SNOFROMQASQA,QASQBWHERE((QA.PNO=207ANDQB.PNO=215)ANDQA.SNO=QB.SNO)924.3.6子查詢在WHERE子句中包含一個形如SELECT-FROM-WHERE的查詢塊,此查詢塊稱為子查詢或嵌套查詢,包含子查詢的語句稱為父查詢或外部查詢。嵌套查詢可以將一系列簡單查詢構成複雜查詢,增強查詢能力。子查詢的嵌套層次最多可達到255層,以層層嵌套的方式構造查詢充分體現了SQL“結構化”的特點。嵌套查詢在執行時由裏向外處理,每個子查詢是在上一級外部查詢處理之前完成,父查詢要用到子查詢的結果。934.3.6.1

返回一個值的子查詢當子查詢的返回值只有一個時,可以使用比較運算符

=,>,<,>=,<=,<>將父查詢和子查詢連接起來。例4.26查詢與51號供應者地址相同的供應商號、供應商姓名。SELECTSNO,SNAMEFROMSWHEREADDR=(SELECTADDRFROMSWHERESNO=51)94此查詢相當於分成兩個查詢塊來執行。先執行子查詢:SELECTADDRFROMSWHERESNO=51子查詢向主查詢只返回一個值,即51號供應商的地址‘beijing’,然後以此作為父查詢的條件,相當於再執行父查詢,查詢所有地址為‘beijing’的供應商號、姓名。SELECTSNO,SNAMEFROMSWHEREADDR=’beijing’954.3.6.2返回一組值的子查詢如果子查詢的返回值不止一個,而是一個集合時,則不能直接使用比較運算符,可以在比較運算符和子查詢之間插入IN或[NOT]EXISTS。1.使用IN例4.27檢索庫存量小於200的零件的供應號。SELECTDISTINCTSNOFROMQWHEREPNOIN(SELECTPNOFROMPWHEREQUTY<200)962.使用EXISTSEXISTS表示存在量詞,帶有EXISTS的子查詢不返回任何實際數據,它只得到邏輯值“真”或“假”。當子查詢的的查詢結果集合為非空時,外層的WHERE子句返回真值,否則返回假值。NOTEXISTS與此相反。含有IN的查詢通常可用EXISTS表示,但反過來不一定。97例4.28檢索可供應207號零件的供應商名字。SELECTSNAMEFROMSWHEREEXISTS(SELECT*FROMQWHEREPNO=207ANDSNO=S.SNO)當子查詢Q表存在一行記錄滿足其WHERE子句中的條件時,則父查詢便得到一個值,重複執行以上過程,直到得出最後結果。98例4.29查詢沒有供應零件的供應商姓名。SELECTSNAMEFROMSWHERENOTEXISTS(SELECT*FROMQWHERESNO=S.SNO)選出這樣一些供應商名單,在Q表中不存在他們供應商品的記錄。994.3.7使用了UNION的查詢SQL中提供了並(UNION)運算。如果二個查詢結果是並相容的,則可以並為一個查詢結果,UNION運算自動消去重複元組。例4.30

檢索庫存量大於約1000或由67號供應者供應的零件號。SELECTPNOFROMPWHEREQUTY>1000UNION(SELECTPNOFROMQWHERESNO=67)100課堂練習設有如下一個資料庫:

課題課題編名課題名稱課題經費(萬元)101CAD150102CAM30105CAPP50203CIMS300207GT12215ERP130101人員編號課題編號設備費(萬元)工作量使用經費(萬元)511011540080511055180255210110400705220340600200581023052006720719012672152570030691054200256920315600100情況

102人員編號人員名稱職稱性別地址51張三工程師女北京52李四教授男天津58王五博士男北京67趙露碩士男上海69劉紅工程師男上海75楊達教授女北京人員1031、按要求寫出下列SQL查詢語句:查詢課題經費小於100萬元的課題編號及其名稱;查詢同時參加207和215課題的科研人員編號;查詢情況表中所有人員的編號;檢索52號科研人員的資訊;檢索101號課題的平均工作量;檢索工作量在200-400天的課題編號、人員編號及工作量,並按工作量排序;1042、寫出下列SQL查詢語句的含義:SELECT人員編號FROM情況WHERE課題編號IN(SELECT課題編號FROM課題WHERE課題經費<200)SELECT*FROM人員WHERE人員編號IN(SELECT人員編號FROM情況WHERE課題編號IN(SELECT課題編號FROM課題WHERE課題經費<200))SELECT課題編號FROM情況GROUPBY課題編號HAVINGCOUNT(*)>1SELECT人員姓名FROM人員WHEREEXISTS(SELECT*FROM情況WHERE情況.課題編號=207AND情況.人員編號=人員.人員編號)SELECT課題編號FROM課題WHERE課題經費>100UNIONSELECT課題編號FROM情況WHERE人員編號=67105課堂練習答案:1、SELECT課題編號,課題名稱FROM課題WHERE課題經費<100SELECTQK1.人員編號FROM情況ASQK1,情況ASQK2WHEREQK1.課題編號=207ANDQK2.課題編號=215ANDQK1.人員編號=QK2.人員編號SELECTDISTINCT人員編號FROM情況SELECT*FROM人員WHERE人員編號<‘S2’SELECT‘101號人員’,AVG(工作量)FROM情況WHERE課題編號=101SELECT課題編號,人員編號,工作量FROM情況106課堂練習答案:2、檢索參加了課題經費<200萬元的課題的科研人員編號;檢索參加了課題經費<200萬元的課題的科研人員基本資訊;檢索至少有兩人以上參與的課題編號;檢索檢索參與課題編號為207的人員姓名;檢索課題經費>100或者67號科研人員參與的課題編號。1074.4SQL數據更新

SQL語言的數據更新語句DML主要包括插入數據、修改數據和刪除數據三種語句。4.4.1插入數據記錄插入數據是把新的記錄插入到一個已存在的表中。插入數據使用語句INSERTINTO,可分為以下幾種情況。4.4.1.1插入一行新記錄語法格式為:

INSERTINTO<表名>[(<列名1>[,<列名2>…])]VALUES(<值>)其中,<表名>是指要插入新記錄的表

<列名>是可選項,指定待添加數據的列

VALUES子句指定待添加數據的具體值。108例4.31在S表中插入一條供應者記錄(SNO:53;SNAME:'daihong';ADDR:'tianjin')。

INSERTINTOSVALUES(53,'daihong','tianjin')1094.4.1.2插入多行記錄用於表間的拷貝,將一個表中的數據抽取幾行插入另一表中,可以通過子查詢來實現。插入數據的命令語法格式為:INSERTINTO<表名>[(<列名1>[,<列名2>…])]子查詢例4.32現在已建立了一新表QUO52(PNO,PNAME,PRICE,D_TIME),要求加入52號供應者供應零件的情況。首先建立新表QUO52:CREATETABLEQUO52(pnoSMALLINT,pnameCHAR(20),priceFLOAT,D_timeSMALLINT)110然後利用子查詢求出Q表中52號供應者提供的零件號,然後在P表中查詢到這幾種零件的情況,把結果存放在新表QUO52中。INSERTINTOQUO52SELECTQ.PNO,PNAME,PRICE,D_TIMEFROMP,QWHEREQ.SNO=52ANDP.PNO=Q.PNO1114.4.2

修改數據記錄SQL語言可以使用UPDATE語句對表中的一行或多行記錄的某些列值進行修改,其語法格式為:UPDATE<表名>SET<列名>=<運算式>[,<列名>=<運算式>]…[WHERE<條件>]其中:<表名>是指要修改的表SET子句給出要修改的列及其修改後的值WHERE子句指定待修改的記錄應當滿足的條件,WHERE子句省略時,則修改表中的所有記錄。1124.4.2.1修改一行例4.33修改203號零件的庫存量為30。UPDATEPSETQUTY=30WHEREPNO=2034.4.2.2修改多行例4.34將所有52號供應者供應的零件供應價格上調10%。UPDATEQSETPRICE=PRICE+0.1*PRICEWHERESNO=521134.4.3刪除數據記錄使用DELETE語句可以刪除表中的一行或多行記錄,其語法格式為:DELETEFROM<表名>[WHERE<條件>]其中,<表名>是指要刪除數據的表。WHERE子句指定待刪除的記錄應當滿足的條件,WHERE子句省略時,則刪除表中的所有記錄。1144.4.3.1刪除一行記錄例4.35刪除S表中51號供應商的記錄。DELETEFROMSWHERESNO=51執行此語句後,從Q表中刪除一行。4.4.3.2刪除多行記錄例4.36刪除供應者名為‘vesam’供應的所有零件。DELETEFROMQWHERESNO=(SELECTSNOFROMSWHERESNAME='vesam')執行此語句後,從Q表中刪除兩行。1154.5視圖視圖是虛表,其數據不存儲,其記錄來自基本表,只在資料庫中存儲其定義。4.5.1定義和刪除視圖4.5.1.1定義視圖定義視圖使用語句CREATEVIEW,其語法格式為:CREATEVIEW<視圖名>[(<視圖列表>)]AS<子查詢>其中,<視圖列表>為可選項,省略時,視圖的列名由子查詢的結果決定。116例4.37創建一個北京地區供應商供應的零件價目表視圖PBJ。CREATEVIEWPBJ(S#,PNO,PRICE)ASSELECTQ.SNO,PNO,PRICEFROMQ,SWHEREADDR=‘beijing’ANDQ.SNO=S.SNO視圖創建後,只在數據字典中存放視圖的定義,而其中的子查詢SELECT語句並不執行。只有當用戶對視圖進行操作時,才按照視圖的定義將數據從基本表中取出。1174.5.1.2刪除視圖視圖定義後可隨時刪除,刪除視圖的語法格式為:DROPVIEW<視圖名>例4.38

刪除由北京地區供應商供應的零件價目表視圖PBJ。DROPVIEWPBJ1184.5.2查詢視圖視圖定義後,對視圖的查詢操作如同對基本表的查詢操作一樣。例4.36

通過視圖PBJ檢索單價超過20元的零件。SELECT*FROMPBJWHEREPRICE>20由上例可以看出,當對一個基本表進行複雜的查詢時,可以先對基本表建立一個視圖,然後只需對此視圖進行查詢,這樣就不必再鍵入複雜的查詢語句,而將一個複雜的查詢轉換成一個簡單的查詢,從而簡化了查詢操作。1194.5.3更新視圖由於視圖是一張虛表,所以對視圖的更新,最終實際上是轉換成對基本表的更新。其更新操作包括插入、修改和刪除數據,其語法格式如同對基本表的更新操作一樣。有些更新在理論上是不可能的,有些實現起來比較困難,以下僅考慮可以更新的視圖。使用視圖有如下幾個優點:利於數據保密簡化查詢操作保證數據的邏輯獨立性。120小結本章以ACCESS中的SQL查詢為例,介紹了SQL語言的使用方法。在講解SQL語言的同時,進一步介紹了關係資料庫的有關概念,如索引和視圖的概念及其作用。SQL語言具有數據定義、數據查詢、數據更新、數據控制四大功能。其全部功能可以用表4.4的9個動詞概括出來。121為了維護資料庫中數據與現實世界的一致性,對關係資料庫的插入、刪除和修改操作必須有一定的約束條件,這就是關係模型的三類完整性:實體完整性參照完整性用戶定義的完整性1.實體完整性(EntityIntegrity)實體完整性是指主碼的值不能為空或部分為空。例如,圖5.4中學生關係中的主碼“學號”不能為空;選課關係中的主碼“學號+課程號”不能部分為空,即“學號”和“課程號”兩個屬性都不能為空。5.1關係模型的完整性1222.

參照完整性(Referentialintegrity)如果關係R2的外部關係碼X與關係R1的主碼相符,則X的每個值或者等於R1中主碼的某一個值,或者取空值。如圖5.1,5.2所示,學生關係中某個學生(如s1或s2)“系別”的取值,必須在參照的系別關係中主碼“系別”的值中能夠找到,否則表示把該學生分配到一個不存在的部門中,顯然不符合語義。如果某個學生(如s11)“系別”取空值,則表示該學生尚未分配到任何一個系。否則,它只能取專業關係中某個元組的專業號值。123S(學生關係)D(系別關係)

圖5.1S表(學生表)圖5.2D表(系別表)SNO學號SN姓名SEX性別AGE年齡DEPT系別S1趙亦女17電腦S2錢爾男18資訊……………S11王威男19DEPT系別ADDR地址電腦1號樓資訊1號樓……自動化3號樓124實體完整性和參照完整性是關係模型必須滿足的完整性約束條件,被稱作關係的兩個不變性。任何關係資料庫系統都應該支持這兩類完整性。除此之外,不同的關係資料庫系統由於應用環境的不同,往往還需要一些特殊的約束條件,這就是用戶定義完整性。3.用戶定義完整性(User-definedIntegrity)用戶定義完整性是針對某一具體關係資料庫的約束條件。它反映某一具體應用所涉及的數據必須滿足的語義要求。例如,屬性值根據實際需要,要具備一些約束條件,如選課關係中成績不能為負數;某些數據的輸入格式要有一些限制,關係模型應該提供定義和檢驗這類完整性的機制,以便用統一的、系統的方法處理它們,而不要由應用程式承擔這一功能。1255.2規範化問題的提出5.2.1規範化理論的主要內容關係資料庫的規範化理論主要包括三個方面的內容:函數依賴範式(NormalForm)模式設計其中,函數信賴起著核心的作用,是模式分解和模式設計的基礎,範式是模式分解的標準。1265.1.2關係模式的存儲異常問題資料庫的邏輯設計為什麼要遵循一定的規範化理論?什麼是好的關係模式?某些不好的關係模式可能導致哪些問題?下麵通過例子進行分析:例如:要求設計教學管理資料庫,其關係模式SCD如下:

SCD(SNO,SN,AGE,DEPT,MN,CNO,SCORE)其中,SNO表示學生學號,SN表示學生姓名,AGE表示學生年齡,DEPT表示學生所在的系別,MN表示系主任姓名,CNO表示課程號,SCORE表示成績。127根據實際情況,這些數據有如下語義規定:一個系有若干個學生,但一個學生只屬於一個系;一個系只有一名系主任,但一個系主任可以同時兼幾個系的系主任;一個學生可以選修多門功課,每門課程可有若干學生選修;每個學生學習某門課程有一個成績。在此關係模式中填入一部分具體的數據,則可得到SCD關係模式的實例,即一個教學管理資料庫,如圖5.3所示。128圖5.3關係SCDSNOSNAGEDEPTMNCNOSCORES1趙亦17電腦劉偉C190S1趙亦17電腦劉偉C285S2錢爾18資訊王平C557S2錢爾18資訊王平C680S2錢爾18資訊王平C7

70S2錢爾18資訊王平C570S3孫珊20資訊王平C10S3孫珊20資訊王平C270S3孫珊20資訊王平C485S4李思男自動化劉偉C193返回原處129根據上述的語義規定,可以看出:(SNO,CNO)屬性的組合能唯一標識一個元組,所以(SNO,CNO)是該關係模式的主碼。對圖5.3所示的進行資料庫的操作時,會出現以下幾方面的問題:數據冗餘。每個系名和系主任的名字存儲的次數等於該系的學生人數乘以每個學生選修的課程門數,同時學生

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论