




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
(2003/9/21)(高教--答案,第3、4章)03-PAGE34第3章關系數據庫語言SQL3.1基本內容分析3.1.1本章重要概念(1)SQL數據庫的體系結構,SQL的組成。(2)SQL的數據定義:SQL模式、基本表和索引的創建和撤銷。(3)SQL的數據查詢;SELECT語句的句法,SELECT語句的三種形式及各種限定,基本表的聯接操作,SQL3中的遞歸查詢。(4)SQL的數據更新:插入、刪除和修改語句。(5)視圖的創建和撤消,對視圖更新操作的限制。(6)嵌入式SQL:預處理方式,使用規定,使用技術,卷游標,動態SQL語句。3.1.2本章的重點篇幅(1)教材中P97的例3.8(SELECT語句)。(2)教材中P123的例3.31和P123的例3.32(嵌入式SQL)。3.1.3重要內容分析SELECT語句是SQL的核心內容,對于該語句考生應掌握下列內容。1.SELECT語句的來歷在關系代數中最常用的式子是下列表達式:πA1,…,An(σF(R1×…×Rm))這里R1、…、Rm為關系,F是公式,A1、…、An為屬性。 針對上述表達式,SQL為此設計了SELECT—FROM—WHERE句型: SELECTA1,…,An FROMR1,…,Rm WHEREF這個句型是從關系代數表達式演變來的,但WHERE子句中的條件表達式F要比關系代數中公式更靈活。2.SELECT語句中出現的基本表名,應理解為基本表中的元組變量,而列名應理解為元組分量。3.SELECT語句的語義有三種情況,下面以學生表S(S#,SNAME,AGE,SEX)為例說明。第一種情況:SELECT語句中未使用分組子句,也未使用聚合操作,那么SELECT子句的語義是對查詢的結果執行投影操作。譬如: SELECTS#,SNAME FROMS WHERESEX='M';第二種情況:SELECT語句中未使用分組子句,但在SELECT子句中使用了聚合操作,此時SELECT子句的語義是對查詢結果執行聚合操作。譬如: SELECTCOUNT(*),AVG(AGE) FROMS WHERESEX='M';該語句是求男同學的人數和平均年齡。第三種情況:SELECT語句使用了分組子句和聚合操作(有分組子句時必有聚合操作),此時SELECT子句的語義是對查詢結果的每一分組去做聚合操作。譬如: SELECTAGE,COUNT(*) FROMS WHERESEX='M'GROUPBYAGE;該語句是求男同學每一年齡的人數。4.SELECT語句中使用分組子句的先決條件是要有聚合操作。但執行聚合操作不一定要用分組子句。譬如求男同學的人數,此時聚合值只有一個,因此不必分組。但同一個聚合操作的值有多個時,必須使用分組子句。譬如求每一年齡的學生人數。此時聚合值有多個,與年齡有關,因此必須分組。3.2教材中習題3的解答3.1名詞解釋·基本表:實際存儲在數據庫中的表,稱為基本表。·視圖:是從基本表或其他視圖中導出的表,它本身不獨立存儲在數據庫中,也就是數據庫中只存放視圖的定義而不存放視圖的數據。·實表:是對基本表的別稱。·虛表:是對視圖的別稱。·相關子查詢:SELECT語句嵌套時,子查詢中查詢條件依賴于外層查詢中的值,因此子查詢要反復求值供外層查詢使用。這種子查詢稱為相關子查詢。·聯接查詢:查詢時要從多個基本表中提取數據,此時把多個基本表寫在同一層的FROM子句中,這種查詢形式稱為聯接查詢。·嵌套查詢:查詢時要從多個基本表中提取數據,此時把多個基本表分別放在不同層次上的FROM子句中,這種查詢形式稱為嵌套查詢。·交互式SQL:在終端交互方式使用的SQL語言。·嵌入式SQL:嵌入在高級語言的程序中使用的SQL語言。·共享變量:嵌入的SQL語句和主語言語句間傳遞信息的變量,稱為共享變量。共享變量先由主語言程序定義,再用SQL的說明語句說明,然后SQL語句就可使用這些變量。·游標:游標是與某一查詢相聯系的符號名。游標有游標關系和游標指針兩層含義。在游標打開時,游標(指針)指向查詢結果的第一個記錄之前。·卷游標:在游標推進時,可以進退自如的游標。3.2對于教學數據庫的三個基本表S(S#,SNAME,AGE,SEX)SC(S#,C#,GRADE)C(C#,CNAME,TEACHER)試用SQL的查詢語句表達下列查詢:=1\*GB3①檢索LIU老師所授課程的課程號和課程名。=2\*GB3②檢索年齡大于23歲的男學生的學號和姓名。=3\*GB3③檢索學號為S3學生所學課程的課程名與任課教師名。=4\*GB3④檢索至少選修LIU老師所授課程中一門課程的女學生姓名。=5\*GB3⑤檢索WANG同學不學的課程的課程號。=6\*GB3⑥檢索至少選修兩門課程的學生學號。=7\*GB3⑦檢索全部學生都選修的課程的課程號與課程名。⑧檢索選修課程包含LIU老師所授課程的學生學號。解:① SELECTC#,CNAMEFROMCWHERETNAME=’LIU’;SELECTS#,SNAMEFROMSWHEREAGE>23ANDSEX=’M’;③ SELECTCNAME,TEACHERFROMSC,CWHERESC.C#=C.C#ANDS#=’S3’;④ SELECTSNAME (聯接查詢方式)FROMS,SC,CWHERES.S#=SC.S# ANDSC.C#=C.C#ANDSEX=’F’ ANDTNAME=’LIU’;或:SELECTSNAME (嵌套查詢方式)FROMSWHERESEX=’F’ANDS#IN(SELECTS#FROMSCWHEREC#IN(SELECTC#FROMCWHERETNAME=’LIU’));或:SELECTSNAME (存在量詞方式)FROMSWHERESEX=’F’ANDEXISTS(SELECT*FROMSCWHERESC.S#=S.S#ANDEXISTS(SELECT* FROMC WHEREC.C#=SC.C# ANDTNAME=’LIU’));⑤ SELECTC#FROMCWHERENOTEXISTS (SELECT* FROMS,SC WHERES.S#=SC.S#ANDSC.C#=C.C# ANDSNAME=’WANG’);SELECTDISTINCTX.S#FROMSCASX,SCASYWHEREX.S#=Y.S#ANDX.C#!=Y.C#;SELECTC#,CNAMEFROMCWHERENOTEXISTS(SELECT*FROMSWHERENOTEXISTS (SELECT* FROMSC WHERES#=S.S#ANDC#=C.C#));在1974年的SYSTEMR系統中,曾使用過“集合包含”的語法,即 (集合1)CONTAINS(集合2)用這種語法也能寫出本題的SELECT語句,即: SELECTC#,CNAME FROMC WHERE(SELECTS#FROMSCWHEREC#=C.C#) CONTAINS (SELECTS#FROMS); 由于判斷“(集合1)CONTAINS(集合2)”與“NOTEXISTS((集合2)EXCEPT(集合1))”是等價的,因此本題的SELECT語句也能這樣寫:SELECTC#,CNAME FROMC WHERENOTEXISTS((SELECTS#FROMS)EXCEPT(SELECTS#FROMSCWHEREC#=C.C#));SELECTDISTINCTS#FROMSCASXWHERENOTEXISTS (SELECT* FROMC WHERETNAME=’LIU’ ANDNOTEXISTS (SELECT* FROMSCASY WHEREY.S#=X.S#ANDY.C#=C.C#));與⑦類似,本題的SELECT語句也能這樣寫: SELECTDISTINCTS# FROMSCX WHERENOTEXISTS((SELECTC#FROMCWHERETEACHER=’LIU’)EXCEPT(SELECTC#FROMSCYWHEREY.S#=X.S#));3.3對于第3.2題中的8個查詢語句,試給出SELECT語句的圖示形式。解:為了說明問題,這里先用高級語言的算法形式表示其執行過程,再給出圖示形式。下面給出④、⑤、⑦、⑧的算法及圖示形式。④如果把三個關系S、SC、C看成三個文件,那么可以看出這個查詢語句的SELECT語句實際上是一個三重循環。從而可得這個查詢的算法形式如下:for關系S的每個元組do {which:=false; ifS.SEX=’F’then for關系SC的每個元組,且NOTwhichdo ifSC.S#=S.S#then for關系C的每個元組,且NOTwhichdo ifC.C#=SC.C#,且TEACHER=’LIU’then {print(S.SNAME);which:=true;} }; 這個算法可以用圖3.1表示。SS#SNAMEAGESEXSCS#C#GRADECC#CNAMETEACHER_XP.F_X_Y_YLIU圖3.1⑤for關系S的每個元組do {ifS.SNAME=’WANG’thenfor關系C的每個元組do {which:=false; for關系SC的每個元組,且NOTwhichdo ifSC.S#=S.S#,且SC.C#=C.C#thenwhich:=true;ifNOTwhichthenprint(S.SNAME);}; 這個算法可以用圖3.2表示。圖中“┐”表示“NOTEXISTS”,即“不存在滿足此條件的元組”SS#SNAMEAGESEXCC#CNAMETEACHERSCS#C#GRADE_XWANGP._Y┐_X_Y圖3.2⑦for關系C的每個元組do {which1:=false; for關系S的每個元組,且NOTwhich1do{which2:=false;for關系SC的每個元組,且NOTwhich2doifSC.S#=S.S#,且SC.C#=C.C#thenwhich2:=true;ifNOTwhich2thenwhich1:=true;};ifNOTwhich1thenprint(C.C#,C.CNAME); }; 這個算法可以用圖3.3表示。CC#CNAMETEACHERSS#SNAMEAGESEXSCS#C#GRADEP._XP.┐_Y┐_Y_X圖3.3⑧for關系SC的每個元組xdo {which1:=false; for關系C的每個元組y,且NOTwhich1do{ify.TEACHER=’LIU’then {which2:=false;for關系SC的每個元組z,且NOTwhich2doifz.S#=x.S#,且z.C#=y.C#thenwhich2:=true;ifNOTwhich2thenwhich1:=true;};ifNOTwhich1thenprint(x.S#);}}; 這個算法可以用圖3.4表示。SCS#C#GRADECC#CNAMETEACHERSCS#C#GRADEP._XP.┐_YLIU┐_X_Y圖3.43.4設有兩個基本表R(A,B,C)和S(A,B,C),試用SQL查詢語句表達下列關系代數表達式:=1\*GB3①R∪S =2\*GB3②R∩S =3\*GB3③R-S ④ R×S ⑤πA,B(R)πB,C(S)3=3課⑥π1,6(σ3=4(R×S) ⑦π1,2,3(RS) ⑧R÷πC(S)3=3課解:①(SELECT*FROMR) UNION (SELECT*FROMS);②(SELECT*FROMR) INTERSECT (SELECT*FROMS);③(SELECT*FROMR) MINUS (SELECT*FROMS);④SELECT*FROMR,S;⑤SELECTR.A,R.B,S.CFROMR,SWHERER.B=S.B;⑥SELECTR.A,S.CFROMR,SWHERER.C=S.A;⑦SELECTR.* (R.*表示R中全部屬性)FROMR,SWHERER.C=S.C;⑧ R÷πC(S)的元組表達式如下:{t|(?u)(?v)(?w)(R(u)∧S(v)∧R(w)∧w[1]=u[1]∧w[2]=u[2]∧w[3]=v[3]∧t[1]=u[1]∧t[2]=u[2])}據此,可寫出SELECT語句: SELECTA,BFROMRRXWHERENOTEXISTS(SELECT*FROMSWHERENOTEXISTS(SELECT*FROMRRYWHERERY.A=RX.AANDRY.B=RX.BANDRY.C=S.C));3.5設有兩個關系R(A,B)和S(A,C),試用SQL查詢語句表示下列域表達式:①{a|($b)(R(ab)∧b=‘17’)}②{abc|R(ab)∧S(ac)}③{a|($c)($b1)($b2)(S(ac)∧R(ab1)∧R(cb2)∧b1>b2)}解:① SELECTA FROMR WHEREB=17;② SELECTR.A,R.B,S.C FROMR,S WHERER.A=S.A;③ SELECTS.A FROMS,RRX,RRY WHERES.A=RX.AANDRX.B>RY.B;3.6試敘述SQL語言的關系代數特點和元組演算特點。答:SQL的關系代數特點如下:有關系代數運算的并、交、差、自然聯接等運算符;FROM子句體現了笛卡爾積操作,WHERE子句體現了選擇操作,SELECT子句體現了投影操作。SQL的元組演算特點如下:FROM子句中的基本表名應視為“元組變量”,屬性名應視為“元組分量”;有存在量詞EXISTS符號。3.7試用SQL查詢語句表達下列對3.2題中三個基本表S、SC、C的查詢:=1\*GB3①在表C中統計開設課程的教師人數。=2\*GB3②求選修C4課程的女學生的平均年齡。=3\*GB3③求LIU老師所授課程的每門課程的平均成績。=4\*GB3④統計每個學生選修課程的門數(超過5門的學生才統計)。要求輸出學生學號和選修門數,查詢結果按門數降序排列,若門數相同,按學號升序排列。=5\*GB3⑤檢索學號比WANG同學大,而年齡比他小的學生姓名。=6\*GB3⑥在表SC中檢索成績為空值的學生學號和課程號。=7\*GB3⑦檢索姓名以L打頭的所有學生的姓名和年齡。=8\*GB3⑧求年齡大于女同學平均年齡的男學生姓名和年齡。=9\*GB3⑨求年齡大于所有女同學年齡的男學生姓名和年齡。解:=1\*GB3① SELECTCOUNT(DISTINCTTEACHER) FROMC;=2\*GB3② SELECTAVG(AGE) FROMS,SC WHERES.S#=SC.S#ANDC#=’C4’ANDSEX=’F’;=3\*GB3③ SELECTC.C#,AVG(GRADE) FROMSC,C WHERESC.C#=C.C#ANDTEACHER=‘LIU’ GROUPBYC.C#;=4\*GB3④ SELECTS#,COUNT(C#) FROMSC GROUPBYS# HAVINGCOUNT(*)>5 ORDERBY2DESC,1;=5\*GB3⑤ SELECTSNAME FROMS WHERES#>ALL(SELECTS# FROMS WHERESNAME=’WANG’) ANDAGE<ALL(SELECTS#FROMSWHERESNAME=’WANG’);=6\*GB3⑥ SELECTS#,C# FROMSC WHEREGRADEISNULL;=7\*GB3⑦ SELECTSNAME,AGE FROMS WHERESNAMELIKE’L%’;=8\*GB3⑧ SELECTSNAME,AGE FROMS WHERESEX=’M’ANDAGE>(SELECTAVG(AGE)FROMSWHERESEX=’F’);=9\*GB3⑨ SELECTSNAME,AGE FROMS WHERESEX=’M’ ANDAGE>ALL(SELECTAGEFROMSWHERESEX=’F’);3.8對于下面的關系R和S,試求出下列各種聯接操作的執行結果:① RNATURALINNERJOINS② RNATURALRIGHTOUTERJOINS③ RRIGHTOUTERJOINSUSING(C)④ RINNERJOINS⑤ RFULLOUTERJOINSONfalseRABCSBCDa1b1c1b1c1d1a2b2c2b2c2d2a3b3c3b4c4d4解:①ABCD②ABCD③AR.BCS.BDa1b1c1d1a1b1c1d1a1b1c1b1d1a2b2c2d2a2b2c2d2a2b2c2b2d2nullb4c4d4nullnullc4b4d4④AR.BR.CS.BS.CD⑤AR.BR.CS.BS.CDa1b1c1b1c1d1a1b1c1nullnullnulla1b1c1b2c2d2a2b2c2nullnullnulla1b1c1b4c4d4a3b3c3nullnullnulla2b2c2b1c1d1nullnullnullb1c1d1a2b2c2b2c2d2nullnullnullb2c2d2a2b2c2b4c4d4nullnullnullb4c4d4a3b3c3b1c1d1a3b3c3b2c2d2a3b3c3b4c4d43.9SQL2提供CASE表達式操作,這個操作類似于程序設計語言中的多分支選擇結構,其句法如下: CASE WHEN條件1THEN結果1 WHEN條件2THEN結果2…… WHEN條件nTHEN結果nELSE結果m END如果自上而下“條件i”首先被滿足,那么這個操作返回值“結果i”(可以是某個表達式的值);如果沒有一個條件被滿足,那么返回值“結果m”。 在基本表SC(S#,C#,GRADE)中,GRADE值是百分制。如果欲轉換成“成績等第”,則規則如下:若GRADE<40則等第為F,若40≤GRADE<60則等第為C,若60≤GRADE<80則等第為B,若80≤GRADE則等第為A。試寫出下列兩個查詢語句:①檢索每個學生的學習成績,成績顯示時以等第(SCORE)形式出現。②檢索每個等第的學生人次數。解:①SELECTS#,C#,CASEWHENGRADE>=80THEN'A'WHENGRADE>=60THEN'B'WHENGRADE>=40THEN'C'ELSE'F'ENDASSCOREFROMSC;②SELECTSCORE,COUNT(S#)FROM(SELECTS#,C#,CASEWHENGRADE>=80THEN'A'WHENGRADE>=60THEN'B'WHENGRADE>=40THEN'C'ELSE'F'ENDFROMSC)ASRESULT(S#,C#,SCORE)GROUPBYSCORE;3.10用第3.9題給出的CASE操作在下列更新語句中完成SC表中的元組更新:①若課程號為C5則增加6分,若課程號為C8則增加10分,其他一律增加5分。②若C4課程的成績低于該門課平均成績時,提高5%,否則提高4%。解:①UPDATESCSETGRADE=GRADE+CASEWHENC#='C5'THEN6WHENC#='C8'THEN10ELSE5END;②UPDATESCSETGRADE=GRADE*CASEWHENGRADE<(SELECTAVG(GRADE)FROMSCWHEREC#='C4')THEN1.05ELSE1.04ENDWHEREC#='C4';3.11設零件之間有組合聯系,其關系模式如下:PART(P#,PNAME,SUBP#,TOTAL)其屬性表示零件編號、零件名稱、所需子零件編號及數量。設臨時關系W(P#,SUBP#)的屬性分別表示零件編號、這種零件的直接或間接子零件編號。①試寫出表示關系W的規則。②寫出計算W的遞歸查詢語句。解:① W(x,y)←PART(x,g,y,h)W(x,y)←W(x,z)∧W(z,y)② WITHRECURSIVEW(P#,SUBP#)AS (SELECTP#,SUBP#FROMPART) UNION (SELECTW1.P#,W2.SUBP# FROMWASW1,WASW2 WHEREW1.SUBP#=W2.P#) SELECT*FROMW;3.12試用SQL更新語句表達對3.2題教學數據庫中關系S、SC、C的更新操作:=1\*GB3①往關系C中插一個課程元組('C8','VC++','BAO')。=2\*GB3②檢索所授每門課程平均成績均大于80分的教師姓名,并把檢索到的值送往另一個已存在的表FACULTY(TNAME)。=3\*GB3③在SC中刪除尚無成績的選課元組。=4\*GB3④把選修LIU老師課程的女同學選課元組全部刪去。=5\*GB3⑤把MATHS課不及格的成績全改為60分。=6\*GB3⑥把低于所有課程總平均成績的女同學成績提高5%。=7\*GB3⑦在表SC中修改C4課程的成績,若成績小于等于70分時提高5%,若成績大于70 分時提高4%(用兩種方法實現,一種方法是用兩個UPDATE語句實現,另一種方法是用帶CASE操作的一個UPDATE語句實現)。⑧在表SC中,當某個成績低于全部課程的平均成績時,提高5%。解:①INSERTINTOCVALUES('C8','VC++','BAO');②INSERTINTOFACULTY(TNAME)SELECTDISTINCTTEACHERFROM(SELECTTEACHER,C.C#,AVG(GRADE)FROMS,SCWHERESC.C#=C.C#GROUPBYTEACHER,C.C#)ASRESULT(TEACHER,C#,AVG_GRADE)ASXWHERE80<=ALL(SELECTAVG_GRADEFROMRESULTASYWHEREY.TEACHER=X.TEACHER);③DELETEFROMSCWHEREGRADEISNULL;④DELETEFROMSCWHERES#IN(SELECTS#FROMSWHERESEX='F')ANDC#IN(SELECTC#FROMCWHERETEACHER='LIU');⑤UPDATESCSETGRADE=60WHEREGRADE<60ANDC#IN(SELECTC#FROMCWHERECNAME='MATHS');⑥UPDATESCSETGRADE=GRADE*1.05WHERES#IN(SELECTS#FROMSWHERESEX='F')ANDGRADE<(SELECTAVG(GRADE)FROMSC);⑦用兩個UPDATE語句實現:UPDATESCSETGRADE=GRADE*1.04WHEREC#='C4'ANDGRADE>70;UPDATESCSETGRADE=GRADE*1.05WHEREC#='C4'ANDGRADE<=70;(這兩個UPDATE語句的順序不能顛倒。)用一個UPDATE語句實現:UPDATESCSETGRADE=GRADE*CASEWHENGRADE>70THEN1.04ELSE1.05ENDWHEREC#='C4';⑧UPDATESC SETGRADE=GRADE*1.05 WHEREGRADE<(SELECTAVG(GRADE) FROMSC);3.13設數據庫中有三個關系: 職工表 EMP(E#,ENAME,AGE,SEX,ECITY),其屬性分別表示職工工號、姓名、年齡、性別和籍貫。工作表 WORKS(E#,C#,SALARY),其屬性分別表示職工工號、工作的公司編號和工資。公司表 COMP(C#,CNAME,CITY),其屬性分別表示公司編號、公司名稱和公司所在城市。試用SQL語句寫出下列操作:①用CREATETABLE語句創建上述三個表,需指出主鍵和外鍵。②檢索超過50歲的男職工的工號和姓名。③假設每個職工只能在一個公司工作,檢索工資超過1000元的男性職工工號和姓名。④假設每個職工可在多個公司工作,檢索在編號為C4和C8公司兼職的職工工號和姓名。⑤檢索在“聯華公司”工作、工資超過1000元的男性職工的工號和姓名。⑥假設每個職工可在多個公司工作,檢索每個職工的兼職公司數目和工資總數.顯示(E#,NUM,SUM_SALARY),分別表示工號、公司數目和工資總數。⑦工號為E6的職工在多個公司工作,試檢索至少在E6職工兼職的所有公司工作的職工工號。⑧檢索聯華公司中低于本公司平均工資的職工工號和姓名。⑨在每一公司中為50歲以上職工加薪100元(若職工為多個公司工作,可重復加)。⑩在EMP表和WORKS表中刪除年齡大于60歲的職工有關元組。解:① CREATETABLEEMP(E# CHAR(4)NOTNULL,ENAME CHAR(8)NOTNULL,AGE SMALLINT,SEX CHAR(1),ECITY CHAR(20),PRIMARYKEY(E#));CREATETABLECOMP(C# CHAR(4)NOTNULL,CNAME CHAR(20)NOTNULL,CITY CHAR(20),PRIMARYKEY(C#)); CREATETABLEWORKS(E# CHAR(4)NOTNULL,C# CHAR(4)NOTNULL,SALARY SMALLINT,PRIMARYKEY(E#,C#),FOREIGNKEY(E#)REFERENCESEMP(E#),FOREIGNKEY(C#)REFERENCESCOMP(C#));② SELECTE#,ENAMEFROMEMPWHEREAGE>50ANDSEX='M';③ SELECTEMP.E#,ENAMEFROMEMP,WORKSWHEREEMP.E#=WORKS.E#ANDSALARY>1000;④ SELECTA.E#,A.ENAMEFROMEMPA,WORKSB,WORKSCWHEREA.E#=B.E#ANDB.E#=C.E#ANDB.C#='C4'ANDC.C#='C8';⑤ SELECTA.E#,A.ENAMEFROMEMPA,WORKSB,COMPCWHEREA.E#=B.E#ANDB.C#=C.C#ANDCNAME='聯華公司'ANDSALARY>1000ANDSEX='M';⑥ SELECTE#,COUNT(C#)ASNUM,SUM(SALARY)ASSUM_SALARYFROMWORKSGROUPBYE#;⑦ SELECTX.E#FROMWORKSXWHERENOTEXISTS(SELECT*FROMWORKSYWHEREE#='E6'ANDNOTEXISTS(SELECT*FROMWORKSZWHEREZ.E#=X.E#ANDZ.C#=Y.C#));⑧ SELECTA.E#,A.ENAMEFROMEMPA,WORKSB,COMPCWHEREA.E#=B.E#ANDB.C#=C.C#ANDCNAME='聯華公司'ANDSALARY<(SELECTAVG(SALARY)FROMWORKS,COMPWHEREWORKS.C#=COMP.C#ANDCNAME='聯華公司');⑨ UPDATEWORKSSETSALARY=SALARY+100WHEREE#IN(SELECTE#FROMEMPWHEREAGE>50);⑩ DELETEFROMWORKS WHEREE#IN(SELECTE#FROMEMPWHEREAGE>60); DELETEFROMEMP WHEREAGE>60;3.14對第3.13題中的關系建立一個有關女職工信息的視圖EMP_WOMAN,屬性包括(E#,ENAME,C#,CNAME,SALARY)。然后對視圖EMP_WOMAN操作,檢索每一位女職工的工資總數。(假設每個職工可在多個公司兼職)解: CREATEVIEWEMP_WOMANASSELECTA.E#,A.ENAME,C.C#,CNAME,SALARYFROMEMPA,WORKSB,COMPCWHEREA.E#=B.E#ANDB.C#=C.C#ANDSEX='F';SELECTE#,SUM(SALARY)FROMEMP_WOMAN GROUPBYE#;3.15在第1章中提到的倉庫管理數據庫中有五個基本表: 零件 PART(P#,PNAME,COLOR,WEIGHT) 項目 PROJECT(J#,JNAME,DATE) 供應商 SUPPLIER(S#,SNAME,SADDR) 供應 P_P(J#,P#,TOTAL) 采購 P_S(P#,S#,QUANTITY) ①試用SQLDDL語句定義上述五個基本表,需說明主鍵和外鍵。②試將PROJECT、P_P、PART三個基本表的聯接定義為一個視圖VIEW1,將PART、P_S、SUPPLIER三個基本表的聯接定義為一個視圖VIEW2。③試在上述兩個視圖的基礎上進行查詢操作:a)檢索上海的供應商所供應的零件的編號和名稱。b)檢索項目J4所用零件的供應商的編號和名稱。解:① CREATETABLEPART(P# CHAR(6),PNAME CHAR(10)NOTNULL,COLOR CHAR(6),WEIGHT FLOAT(6),PRIMARYKEY(P#));CREATETABLEPROJECT(J# CHAR(6),JNAME CHAR(12)NOTNULL,DATE DATE, PRIMARYKEY(J#));CREATETABLESUPPLIER(S# CHAR(8),SNAME CHAR(12)NOTNULL,SADDR VARCHAR(30),PRIMARYKEY(S#));CREATETABLEP_P(J# CHAR(6),P# CHAR(6),TOTALINTEGER,PRIMARYKEY(J#,P#)FOREIGNKEY(J#)REFERENCESPROJECT(J#),FOREIGNKEY(P#)REFERENCESPART(P#));CREATETABLEP_S(P# CHAR(6),S# CHAR(8),QUANTITYINTEGER,PRIMARYKEY(P#,S#)FOREIGNKEY(P#)REFERENCESPART(P#),FOREIGNKEY(S#)REFERENCESSUPPLIER(S#));② CREATEVIEWVIEW1ASSELECTA.J#,JNAME,DATE,C.P#,PNAME,COLOR,WEIGHT,TOTALFROMPROJECTA,P_PB,PARTCWHEREA.J#=B.J#ANDB.P#=C.P#;CREATEVIEWVIEW2ASSELECTA.P#,PNAME,COLOR,WEIGHT,C.S#,SNAME,SADDR,QUANTITYFROMPARTA,P_SB,SUPPLIERCWHEREA.P#=B.P#ANDB.S#=C.S#;③a) SELECTP#,PNAMEFROMVIEW2WHERESADDRLIKE’上海%’;b) SELECTS#,SNAME FROMVIEW1,VIEW2 WHEREVIEW1.P#=VIEW2.P# ANDJ#=’J4’;3.16對于3.2題的教學數據庫中基本表SC,建立一個視圖: CREATEVIEWS_GRADE(S#,C_NUM,AVG_GRADE) ASSELECTS#,COUNT(C#),AVG(GRADE) FROMSC GROUPBYS#; 試判斷下列查詢和更新操作是否允許執行。如允許,寫出轉換到基本表SC上的相應操作。 ① SELECT* FROMS_GRADE;② SELECTS#,C_NUM FROMS_GRADEWHEREAVG_GRADE>80;③ SELECTS#,AVG_GRADE FROMS_GRADEWHEREC_NUM>(SELECTC_NUMFROMS_GRADEWHERES#='S4');④ UPDATES_GRADE SETS#='S3' WHERES#='S4'; ⑤ DELETEFROMS_GRADEWHEREC_NUM>4;答:①允許查詢。相應的操作如下: SELECTS#,COUNT(C#)ASC_NUM,AVG(GRADE)ASAVG_GRADE FROMSC GROUPBYS#;②允許查詢。相應的操作如下: SELECTS#,COUNT(C#)ASC_NUM FROMSC GROUPBYS#HAVINGAVG(GRADE)>80;③允許查詢。相應的操作如下: SELECTS#,AVG(GRADE)ASAVG_GRADE FROMSC GROUPBYS#HAVINGCOUNT(C#)>(SELECTCOUNT(C#)FROMSCGROUPBYS#HAVINGS#='S4');④不允許。C_NUM是對SC中的學生選修門數進行統計,在未更改SC表時,要在視圖S_GRADE中更改門數,是不可能的。⑤不允許。在視圖S_GRADE中刪除選修門數在4門以上的學生元組,勢必造成SC中這些學生學習元組的刪除,這不一定是用戶的原意,因此使用分組和聚合操作的視圖,不允許用戶執行更新操作。3.17預處理方式對于嵌入式SQL的實現有什么重要意義?答:此時宿主語言的編譯程序不必改動,只要提供一個SQL函數定義庫,供編譯時使用。預處理方式只是把源程序中的SQL語句處理成宿主語言的函數調用形式。3.18在宿主語言的程序中使用SQL語句有哪些規定?答:有三條規定:①在程序中要區分SQL語句與宿主語言語句,所有SQL語句必須加前綴標識“EXECSQL”以及結束標志“END_EXEC”;②允許嵌入的SQL語句引用宿主語言的程序變量,而主語句不能引用數據庫中的字段變量;③SQL的集合處理方式與宿主語言的單記錄處理方式之間要用游標機制協調。3.19SQL的集合處理方式與宿主語言單記錄處理方式之間如何協調?答:用游標機制協調。把SELECT語句查詢結果定義成游標關系,以使用文件的方式來使用游標關系。與游標有關的SQL語句有四個:游標定義,游標打開,游標推進,游標關閉。3.20嵌入式SQL的DML語句何時不必涉及到游標?何時必須涉及到游標?答:不涉及游標的DML語句有下面兩種情況: ①INSERT、DELETE、UPDATE語句,只要加上前綴和結束標志,就能嵌入在宿主語言程序中使用;②對于SELECT語句,如果已知查詢結果肯定是單元值,也可不必涉及游標操作。涉及游標的DML語句有下面兩種情況:①當SELECT語句查詢結果是多個元組時,必須用游標機制把多個元組一次一個地傳遞給主程序處理;②對游標指向元組進行修改或刪除操作時,也涉及到游標。3.21在教學數據庫中檢索成績不及格的學生信息,要求顯示(S#,SNAME,C#,CNAME,TEACHER),試編寫實現此功能的嵌有SQL語句的C語言程序段。解: #defineNO_MORE_TUPLES !(strcmp(SQLSTATE,〞02000〞))voidsel(){EXECSQLBEGINDECLARESECTION;charsno[5],cno[5],sname[9],cname[11],teacher[9];charSQLSTATE[6];EXECSQLENDDECLARESECTION;EXECSQLDECLARExCURSORFORSELECTs.s#,sname,c.c#,cname,teacherFROMs,sc,cWHEREs.s#=sc.s#andsc.c#=c.c#andgrade<60;EXECSQLOPENscx;while(1) {EXECSQLFETCHFROMx INTO:sno,:sname,:cno,:cname,:teacher;if(NO_MORE_TUPLES)break;printf(〞%s,%s,%s,%s,%s\n〞,sno,sname,cno,cname,teacher); }EXECSQLCLOSEx;}3.3練習題3.3.1填空題1.在SQL中,關系模式稱為__________,子模式稱為__________,元組稱為__________,屬性稱為__________。2.SQL中,表有兩種:__________和__________,也稱為__________和__________。3.SQL中,用戶有兩種:__________和__________。4.SQL中,外模式一級數據結構的基本單位是__________。5.在“SQL模式”中,主要成分有__________。6.基本表中,“主鍵”概念應該體現其值的__________和__________兩個特征。7.操作“元組IN(集合)”的語義是____________________。8.表達式中的通配符“%”表示__________,“_”(下劃線)表示__________。9.操作“元組>SOME(集合)”的語義是____________________。10.操作“元組<ALL(集合)”的語義是____________________。11.SQL有兩種使用方式:__________和__________。12.嵌入式SQL的預處理方式,是指預處理程序先對源程序進行掃描,識別出__________,并處理成宿主語言的__________形式。13.為保證嵌入式SQL的實現,通常DBMS制造商提供一個__________,供編譯時使用。14.SQL語句嵌入在C語言程序中時,必須加上前綴標識__________和結束標志__________。15.“卷游標”是指____________________。3.3.2單項選擇題(在備選答案中選出一個正確答案)1.在SQL中,用戶可以直接進行查詢操作的是 [ ] A.實表和虛表 B.基本表和實表C.視圖和虛表 D.基本表2.SQL中,聚合函數COUNT(列名)用于 [ ] A.計算元組個數 B.計算屬性的個數C.對一列中的非空值計算個數 D.對一列中的非空值和空值計算個數3.SQL中,與“NOTIN”等價的操作符是 [ ] A.=SOMEB.<>SOMEC.=ALLD.<>ALL4.元組比較操作(a1,a2)>(b1,b2)的意義是 [ ] A.(a1>b1)OR((a1=b1)AND(a2>=b2))B.(a1>=b1)OR((a1=b1)AND(a2>=b2))C.(a1>b1)OR((a1=b1)AND(a2>b2))D.(a1>=b1)OR((a1=b1)AND(a2>b2)5.SQL中,謂詞EXISTS可用來測試一個集合是否 [ ] A.有重復元組 B.有重復的列名C.為非空集合 D.有空值6.對于基本表EMP(ENO,ENAME,SALARY,DNO)其屬性表示職工的工號、姓名、工資和所在部門的編號。 基本表DEPT(DNO,DNAME) 其屬性表示部門的編號和部門名。有一SQL語句: SELECTCOUNT(DISTINCTDNO) FROMEMP;其等價的查詢語句是 [ ] A.統計職工的總人數 B.統計每一部門的職工人數C.統計職工服務的部門數目 D.統計每一職工服務的部門數目7.對于第6題的兩個基本表,有一個SQL語句: SELECTENO,ENAME FROMEMP WHEREDNONOTIN (SELECTDNO FROMDEPT WHEREDNAME='金工車間';其等價的關系代數表達式是: [ ] A.πENO,ENAME(σDNAME≠'金工車間'(EMP?DEPT))DNAME≠'金工車間'B.πENO,ENAMEDNAME≠'金工車間'C.πENO,ENAME(EMP)-πENO,ENAME(σDNAME='金工車間'(EMP?DEPT))D.πENO,ENAME(EMP)-πENO,ENAME(σDNAME≠'金工車間'(EMP?DEPT))8.對于第6題的兩個基本表,有一個SQL語句: UPDATEEMP SETSALARY=SALARY*1.05 WHEREDNO='D6' ANDSALARY<(SELECTAVG(SALARY)FROMEMP);其等價的修改語句為 [ ] A.為工資低于D6部門平均工資的所有職工加薪5%B.為工資低于整個企業平均工資的職工加薪5%C.為在D6部門工作、工資低于整個企業平均工資的職工加薪5%D.為在D6部門工作、工資低于本部門平均工資的職工加薪5%9.有關嵌入式SQL的敘述,不正確的是 [ ] A.宿主語言是指C一類高級程序設計語言B.宿主語言是指SQL語言C.在程序中要區分SQL語句和宿主語言語句D.SQL有交互式和嵌入式兩種使用方式10.嵌入式SQL實現時,采用預處理方式是 [ ] A.把SQL語句和主語言語句區分開來B.為SQL語句加前綴標識和結束標志C.識別出SQL語句,并處理成函數調用形式D.把SQL語句編譯成二進制碼11.允許在嵌入的SQL語句中,引用宿主語言的程序變量,在引用時 [ ] A.直接引用B.這些變量前必須加符號“*”C.這些變量前必須加符號“:”D.這些變量前必須加符號“&”12.如果嵌入的SELECT語句的查詢結果肯定是單元組,那么嵌入時 [ ] A.肯定不涉及游標機制B.必須使用游標機制C.是否使用游標,由應用程序員決定D.是否使用游標,與DBMS有關13.卷游標的推進語句“EXECSQLFETCHRELATIVE-4”表示 [ ] A.把游標移向查詢結果的第4行B.把游標移向查詢結果的倒數第4行C.把游標從當前位置推進4行D.把游標從當前位置返回4行14.卷游標的推進語句“EXECSQLFETCHABSOLUTE-3 ”表示 [ ] A.把游標移向查詢結果的第3行B.把游標移向查詢結果的倒數第3行C.把游標從當前位置推進3行D.把游標從當前位置返回3行3.3.3簡答題1.試敘述SQL的關系代數特點和元組演算特點。2.SQL語言對于“查詢結果是否允許存在重復元組”是如何實現的?3.試對SELECT語句中使用的基本表名和列名的語義作詳細的解釋。4.SELECT語句中,何時使用分組子句,何時不必使用分組子句?3.4練習題答案3.4.1填空題答案1.基本表視圖行列2.基本表視圖實表虛表3.應用程序終端用戶4.視圖5.基本表、視圖、索引、完整性規則等6.惟一非空7.若元組在集合中,其值為true,否則為false8.與零個或多個字符組成的字符串匹配與單個字符匹配9.若元組值大于集合中某一元組值,則其值為true,否則為false10.若元組值小于集合中每一元組值,則其值為true,否則為false11.交互式SQL嵌入式SQL12.SQL語句函數調用13.SQL函數定義庫14.EXECSQL分號(;)15.可以進退自如的游標(即可隨意推進或返回)3.4.2單項選擇題答案1.A 2.C 3.D 4.C 5.C 6.C 7.C8.C 9.B 10.C 11.C 12.C 13.D 14.B3.4.3簡答題答案1.答:SQL的SELECT語句的基本句法來自于關系代數表達式πL(σF(R1×…×Rm)),并且SQL中有并(UNION)、交(INTERSECT)和差(EXCEPT)等操作,因此SQL具有關系代數特點。 SELECT語句中出現的基本表名,都應該理解成基本表中的元組變量,而列名應理解成元組分量,這樣SQL就具有了元組演算的特點。2.答:對于SELECT語句中SELECT子句,若用“SELECTDISTINCT”形式,則查詢結果中不允許有重復元組;若不寫DISTINCT字樣,則查詢結果中允許出現重復元組。3.答:在基本SQL中,SELECT語句中使用的基本表名都應該理解成表中的元組變量,而列名就成了元組分量。這樣就使SELECT語句帶有元組演算的特點。(注:實際上,在基本SQL中,把關系變量和元組變量混為一談了。這在面向對象數據庫中得到了糾正,在引用表時,都要為表定義一個元組變量。)4.答:SELECT語句中使用分組子句的先決條件是要有聚合操作。當聚合操作值與其他屬性的值無關時,不必使用分組子句。譬如求男同學的人數。此時聚合值只有一個,因此不必分組。 當聚合操作值與其他屬性的值有關時,必須使用分組子句。譬如求每一性別的人數。此時聚合值有兩個,與性別有關,因此必須分組。第4章模式設計理論4.1基本知識點4.1.1本章重要概念(1)關系模式的冗余和異常問題。(2)FD的定義、邏輯蘊涵、閉包、推理規則、與關鍵碼的聯系;平凡的FD;屬性集的閉包;推理規則的正確性和完備性;FD集的等價;最小依賴集。(3)無損分解的定義、性質、測試;保持依賴集的分解。(4)關系模式的范式:1NF,2NF,3NF,BCNF。分解成2NF、3NF模式集的算法。(5)MVD、4NF、JD和5NF的定義。4.1.2本章的重點篇幅 (1)教材中P148的例4.13。(無損聯接和保持FD的例子) (2)教材中P149的例4.14和P150的例4.15。(分解成2NF和3NF的例子)4.2教材中習題4的解答4.1名詞解釋·數據冗余:指同一個數據在系統中多次重復出現。·函數依賴(FD):在關系模式R(U)中,FD是形為X→Y的一個命題,只要r是R的當前關系,對r中任意兩個元組t和s,都有t[X]=s[X]蘊涵t[Y]=s[Y],那么稱FDX→Y在關系模式R(U)中成立。·平凡的FD:如果X→Y,且Y?X,則稱X→Y是一個“平凡的FD”。·FD集F的閉包F+:被F邏輯蘊涵的函數依賴全體構成的集合,稱為F的閉包,記為F+,即F+={X→Y|F?X→Y}。·屬性集X的閉包X+:從已知的FD集F使用FD推理規則推出的所有滿足X→A的屬性A的集合,稱為X的閉包,記為X+,即X+={屬性A|X→A在F+中}。·FD的邏輯蘊涵:如果從已知的FD集F能推導出X→Y成立,那么稱F邏輯蘊涵X→Y,記為F?X→Y。·FD集的等價:對于兩個FD集F和G,有F+=G+,則稱F和G是等價的依賴集。·最小依賴集:設F是屬性集U上的FD集,Fmin是F的最小依賴集,那么Fmin應滿足下列四個條件:Fmin+=F+;每個FD的右邊都是單屬性;Fmin中沒有冗余的FD;每個FD的左邊沒有冗余的屬性。ki=1·無損分解:設關系模式R,F是R上的FD集,ρ={R1,…,Rk}是R的一個分解。如果對R中滿足F的每一關系r,都有r=?πRi(r),那么稱分解ρ相對F是“無損分解”ki=1·泛關系假設:指數據庫中每一個關系都是全部屬性構成的關系的投影,此時,由全部屬性構成的關系稱為泛關系。·chase過程:根據已知FD集,對R分解成ρ構造的初始表格的值進行修改,使之符合FD集,這個過程稱為chase過程。ki=1·保持FD:設關系模式R,F是R上的FD分解,ρ={R1,…,Rk}是R的一個分解,如果有∪πRi(F)?F,那么稱分解ρ保持FD集Fki=1·1NF:如果關系模式R的每個關系r的屬性值都是不可分的原子值,那么稱R是1NF的模式。·2NF:如果R是1NF的模式,且每個非主屬性完全函數依賴于R的候選鍵,那么稱R是2NF的模式。·3NF:如果R是1NF的模式,且每個非主屬性都不傳遞依賴于R的候選鍵,那么稱R是3NF的模式。·BCNF:如果R是1NF的模式,且每個屬性都不傳遞依賴于R的候選鍵,那么稱R是BCNF的模式。·4NF:設D是關系模式R上成立的FD和MVD集合。如果D中每個非平凡的MVDX→→Y的左部X都是R的超鍵,那么稱R是4NF模式。·5NF:如果關系模式R的每個JD均由R的候選鍵蘊涵,那么稱R是5NF的模式。·多值依賴(MVD):設關系模式R(U),X和Y是U的子集,Z=U-X-Y。對于R的關系r,若在r中存在元組(x,y1,z1)和(x,y2,z2),就也應存在元組(x,y2,z1)和(x,y1,z2),那么稱MVDX→→Y在模式R上成立。·聯接依賴(JD):設關系模式R(U),R1、…、Rn是U的子集,并滿足U=R1∪…∪Rn,ρ={R1,…,Rn}是R的一個分解。如果對于R的每個關系r都有mρ(r)=r,那么稱JD*(R1,…,Rn)在模式R上成立。4.2用A1、A2和A3三條推理規則來證明4.2.3節中的定理4.2(推理規則A4~A8)。(1)A4(合并性,union):{X→Y,X→Z}?X→YZ。證明:已知X→Y,根據A2,兩邊用X擴充,得到X→XY。從已知X→Z,根據A2兩邊用Y擴充,得到XY→YZ。再根據A3,從X→XY和XY→YZ可得到X→YZ。(2)A5(分解性,decomposition):{X→Y,ZY}?X→Z。證明:已知ZY,可得Y→Z。從Y→Z和已知X→Y,可得X→Z成立。(3)A6(偽傳遞性):{X→Y,WY→Z}?WX→Z。證明:已知X→Y,根據A2,兩邊用W擴充,得到WX→WY。據WX→WY和已知的WY→Z,。再根據A3,可得WX→Z成立。(4)A7(復合性,composition):{X→Y,W→Z}?XW→YZ。證明:已知X→Y,根據A2,兩邊用W擴充,得到WX→WY。從已知W→Z,根據A2兩邊用Y擴充,得到WY→YZ。再根據A3,從WX→WY和WY→YZ可得到XW→YZ成立。(5)A8{X→Y,W→Z}?X∪(W-Y)→YZ。證明:已知X→Y,根據A2,兩邊用(W-Y)擴充,得到X∪(W-Y)→Y∪(W-Y),而Y∪(W-Y)=WY,因此有X∪(W-Y)→WY。從已知W→Z,根據A2兩邊用Y擴充,得到WY→YZ。再根據A3,從X∪(W-Y)→WY和WY→YZ可得到X∪(W-Y)→YZ。4.3對函數依賴X→Y的定義加以擴充,X和Y可以為空屬性集,用φ表示,那么X→φ,φ→Y,φ→φ的含義是什么?答:據推理規則的自反律可知,Xф和фф是平凡的FD,總是成立的。而фY表示在當前關系中,任意兩個元組的Y值相等,也就是當前關系的Y值都相等。4.4設關系模式R有n個屬性,在模式R上可能成立的函數依賴有多少個?其中平凡的FD有多少個?非平凡的FD有多少個?解:這個問題是排列組合問題。FD形為XY,從n個屬性值中選擇屬性組成X共有Ceq\o(\s\do-4(0),\s\do4(n))+Ceq\o(\s\do-3(1),\s\do3(n))+…+Ceq\o(\s\do-4(n),\s\do4(n))=2n種方法;同理,組成Y也有2n種方法。因此組成XY形式應該有2n·2n=4n種方法。即可能成立的FD有4n個。平凡的FD要求YX,組合XY形式的選擇有:Ceq\o(\s\do-4(0),\s\do4(n))·Ceq\o(\s\do-4(0),\s\do4(0))+Ceq\o(\s\do-4(1),\s\do4(n))·(Ceq\o(\s\do-4(0),\s\do4(1))+Ceq\o(\s\do-4(1),\s\do4(1)))+Ceq\o(\s\do-4(2),\s\do4(n))·(Ceq\o(\s\do-4(0),\s\do4(2))+Ceq\o(\s\do-4(1),\s\do4(2))+Ceq\o(\s\do-4(2),\s\do4(2)))+…+Ceq\o(\s\do-4(n),\s\do4(n))(Ceq\o(\s\do-4(0),\s\do4(n))+Ceq\o(\s\do-4(1),\s\do4(n))+…Ceq\o(\s\do-4(n),\s\do4(n)))=Ceq\o(\s\do-4(0),\s\do4(n))·20+Ceq\o(\s\do-4(1),\s\do4(n))·21+Ceq\o(\s\do-4(2),\s\do4(n))·22+…+Ceq\o(\s\do-4(n),\s\do4(n))·2n=(1+2)n=3n即平凡的FD有3n。因而非平凡的FD有4n-3n個。4.5已知關系模式R(ABC),F是R上成立的FD集,F={A→B,B→C},試寫出F的閉包F+。解:據已知條件和推理規則,可知F+有43個FD: Aф ABф ACф ABCф Bф Cф AA ABA ACA ABCA BB CC AB ABB ACB ABCB BC фф AC ABC ACC ABCC BBC AAB ABAB ACAB ABCAB BCф AAC ABAC ACAC ABCAC BCB ABC ABBC ACBC ABCBC BCC AABC ABABC ACABC ABCABC BCBC 4.6設關系模式R(ABCD),F是R上成立的FD集,F={A→B,C→B},則相對于F,試寫出關系模式R的關鍵碼。并說明理由。解:R的關鍵碼為ACD。因為從已知的F,只能推出ACD→ABCD。4.7設關系模式R(ABCD)上FD集為F,并且F={AB→C,C→D,D→A}。 ①試從F求出所有非平凡的FD。②試求R的所有候選鍵。③試求R的所有不是候選鍵的超鍵。 解:①從已知的F可求出非平凡的FD有76個。 譬如,左邊是C的FD有6個:C→A,C→D,C→AD,C→AC,C→CD,C→ACD。 左邊是D的FD有2個:D→A,D→AD。左邊是AB的FD有12個:AB→C,AB→D,AB→CD,AB→AC,……。 感興趣的讀者可以自行把這76個FD寫齊。②候選鍵是能函數決定所有屬性的不含多余屬性的屬性集。根據這個概念可求出R的候選鍵有三個:AB、BC和BD。③R的所有不是候選鍵的超鍵有四個:ABC、ABD、BCD和ABCD。4.8試舉出反例說明下列規則不成立:①{A→B}?{B→A}②{AB→C,A→C}?{B→C}③{AB→C}?{A→C}答:設有三個關系:r1 A B r2 A B C r3 A B C 1 1 2 1 2 1 2 3 2 1 2 2 2 1 3 4 3 2 3(1)在關系r1中,A→B成立,但B→A不成立。(2)在關系r2中,AB→C和A→C成立,但B→C不成立(3)在關系r3中,AB→C成立,但A→C不成立。4.9設關系模式R(ABCD),F是R上成立的FD集,F={A→B,B→C},試寫出屬性集BD的閉包(BD)+。試寫出所有左部是B的函數依賴(即形為“B→?”)。解:①從已知的F,可推出BD→BCD,所以(BD)+=BCD。②由于B+=BC,因此左部是B的FD有四個:B→φ,B→B,B→C,B→BC。4.10設關系模式R(ABCDE)上FD集為F,并且F={A→BC,CD→E,B→D,E→A}。①試求R的候選鍵。②試求B+的值。解:①R的候選鍵有四個:A、E、CD和BC。②B+=BD。4.11設有關系模式R(ABC),其關系r如圖4.1所示。①試判斷下列三個FD在關系r中是否成立?A→B BC→A B→A②根據關系r,你能斷定哪些FD在關系模式R上不成立?ABC123423533
圖4.1解:①在關系r中,A→B成立,BC→A不成立,B→A不成立。 ②在關系r中,不成立的FD有:B→A,C→A,C→B,C→AB,BC→A。4.12設關系模式R(ABC)分解成ρ={AB,BC},如果R上的FD集F={A→B},那么這個分解是損失分解。試舉出R的一個關系r,不滿足mρ(r)=r。解:這個反例r可以舉測試時的初始表格: A B C AB a1 a2 b13 BC b21 a2 a3πAB(r)?πBC(r)有四個元組: A B C a1 a2 b13 a1 a2 a3 b21 a2 b13 b21 a2 a3 即mρ(r)≠r。4.13試解釋數據庫“丟失信息”與“未丟失信息”兩個概念。“丟失信息”與“丟失數據”有什么區別?答:數據庫中丟失信息是指r≠mρ(r),未丟失信息是指r=mρ(r)。 丟失信息是指不能辨別元組的真偽,而丟失數據是指丟失元組。4.14設關系模式R(ABC),F是R上成立的FD集,F={A→C,B→C},試分別求F在模式AB和AC上的投影。答:πAB(F)=φ(即不存在非平凡的FD) πAC(F)={A→C}4.15設關系模式R(ABC),F是R上成立的FD集,F={B→A,C→A},ρ={AB,BC}是R上的一個分解,那么分解ρ是否保持FD集F?并說明理由。答:已知F={B→A,C→A},而πAB(F)={B→A},πBC(F)=φ, 顯然,分解ρ丟失了FDC→A。4.16設關系模式R(ABC),F是R上成立的FD集,F={B→C,C→A},那么分解ρ={AB,AC}相對于F,是否無損分解和保持FD?并說明理由。答:①已知F={B→C,C→A},而πAB(F)=φ,πAC(F)={C→A}顯然,這個分解丟失了FDB→C②用測試過程可以知道,ρ相對于F是損失分解。4.17設關系模式R(ABCDEG)上FD集為F,并且F={D→G,C→A,CD→E,A→B}。①求D+,C+,A+,(CD)+,(AD)+,(AC)+,(ACD)+。②試求R的所有候選鍵。③用ρ1={CDEG,ABC}替換R,這個分解有什么冗余和異常現象?④用ρ2={DG,AC,CDE,AB}替換R,這個分解是無損分解嗎?⑤用ρ3={CDE,AC,DG,BCD}替換R,先求F在ρ3的每個模式上的投影πRi(F),再判斷分解ρ3保持FD嗎?解:①D+=DG,C+=ABC,A+=AB,(CD)+=ABCDEG,(AD)+=ABDG,(AC)+=ABC,(ACD)+=ABCDEG。②R的候選鍵只有一個:CD。③用ρ1={CDEG,ABC}替換R,在模式CDEG中,有局部依賴CD→G,此時在關系中,一個D值只有一個G值,但當這個D值與10個C值對應時,就要出現10個元組,則G值就要重復10次。在模式ABC中,有傳遞依賴(C→A和A→B),此時在關系中,一個A值只有一個B值,但當這個A值與10個C值對應時,就要出現10個元組,則B值就要重復10次。④用ρ2={DG,AC,CDE,AB}替換R,據chase過程可知,相對于F,R分解成ρ是無損分解。⑤用ρ3={CDE,AC,DG,BCD}替換R,則F在模式CDE上的投影為{CD→E},F在模式AC上的投影為{C→A},F在模式DG上的投影為{D→G},F在模式BCD上的投影為{C→B}, 顯然從這四個投影集中的FD推不出原來F中的A→B,因此分解ρ3不保持FD集。4.18設關系模式R(ABCD),F是R上成立的FD集,F={A→B,B→C,A→D,D→C},ρ={AB,AC,BD}是R的一個分解。相對于F,ρ是無損分解嗎?為什么?試求F在ρ的每個模式上的投影。ρ保持F嗎?為什么?答:①用測試過程可以知道,ρ相對于F是損失分解。②πAB(F)={A→B},πAC(F)={A→C},πBD(F)=φ。③顯然,分解ρ不保持FD集F,丟失了B→C、A→D和D→C等三個FD。4.19設關系模式R(ABCD),R上的FD集F={A→C,D→C,BD→A},試說明ρ={AB,ACD,BCD}相對于F是損失分解的理由。答:據已知的F集,不可能把初始表格修改為有一個全a行的表格,因此ρ相對于F是損失分解。4.20設關系模式R(ABCD)上FD集為F,并且F={A→B,B→C,D→B}。 ①R分解成ρ={ACD,BD},試求F在ACD和BD上的投影。②ACD和BD是BCNF嗎?如不是,試分解成BCNF。解:①F在模式ACD上的投影為{A→C,D→C},F在模式BD
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國SBR防水粘合劑行業發展趨勢分析與未來投資戰略咨詢研究報告
- 2025至2030中國Cemiplimabrwlc公司行業發展趨勢分析與未來投資戰略咨詢研究報告
- 2025-2030年黃銅箔行業市場深度分析及發展趨勢與投資戰略研究報告
- 2025-2030年飛機維修行業市場深度調研及發展趨勢與投資戰略研究報告
- 2025-2030年盾構機產業發展分析及發展趨勢與投資前景預測報告
- 2025-2030年濃香型白酒行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年汽車安全系統產業市場深度調研及發展趨勢與投資戰略研究報告
- 2025-2030年挖掘機產業發展分析及發展趨勢與投資前景預測報告
- 異地彩禮返還及財產分割執行協議
- 筆譯保密協議品牌宣傳資料翻譯保密合同
- 網絡與信息安全管理員(四級)考試題庫附答案
- 2024版《安全生產法》考試題庫附答案(共130題)
- 2024年內蒙古北方聯合電力有限責任公司招聘筆試參考題庫含答案解析
- 建設養老院項目計劃書
- 房建工程監理大綱范本(內容全面)
- 2024屆安徽省合肥市包河區第48中學數學七年級第二學期期末經典試題含解析
- 光伏工商業培訓課件
- 骨科患者的疼痛管理
- 2023交通安全專職人員聘用合同范本
- 基于大數據的駕駛員安全駕駛行為分析與應用
- 物業承接查驗標準及表格
評論
0/150
提交評論