




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
(2003/9/21)(高教--答案,第3、4章)03-PAGE34第3章關(guān)系數(shù)據(jù)庫語言SQL3.1基本內(nèi)容分析3.1.1本章重要概念(1)SQL數(shù)據(jù)庫的體系結(jié)構(gòu),SQL的組成。(2)SQL的數(shù)據(jù)定義:SQL模式、基本表和索引的創(chuàng)建和撤銷。(3)SQL的數(shù)據(jù)查詢;SELECT語句的句法,SELECT語句的三種形式及各種限定,基本表的聯(lián)接操作,SQL3中的遞歸查詢。(4)SQL的數(shù)據(jù)更新:插入、刪除和修改語句。(5)視圖的創(chuàng)建和撤消,對(duì)視圖更新操作的限制。(6)嵌入式SQL:預(yù)處理方式,使用規(guī)定,使用技術(shù),卷游標(biāo),動(dòng)態(tài)SQL語句。3.1.2本章的重點(diǎn)篇幅(1)教材中P97的例3.8(SELECT語句)。(2)教材中P123的例3.31和P123的例3.32(嵌入式SQL)。3.1.3重要內(nèi)容分析SELECT語句是SQL的核心內(nèi)容,對(duì)于該語句考生應(yīng)掌握下列內(nèi)容。1.SELECT語句的來歷在關(guān)系代數(shù)中最常用的式子是下列表達(dá)式:πA1,…,An(σF(R1×…×Rm))這里R1、…、Rm為關(guān)系,F(xiàn)是公式,A1、…、An為屬性。 針對(duì)上述表達(dá)式,SQL為此設(shè)計(jì)了SELECT—FROM—WHERE句型: SELECTA1,…,An FROMR1,…,Rm WHEREF這個(gè)句型是從關(guān)系代數(shù)表達(dá)式演變來的,但WHERE子句中的條件表達(dá)式F要比關(guān)系代數(shù)中公式更靈活。2.SELECT語句中出現(xiàn)的基本表名,應(yīng)理解為基本表中的元組變量,而列名應(yīng)理解為元組分量。3.SELECT語句的語義有三種情況,下面以學(xué)生表S(S#,SNAME,AGE,SEX)為例說明。第一種情況:SELECT語句中未使用分組子句,也未使用聚合操作,那么SELECT子句的語義是對(duì)查詢的結(jié)果執(zhí)行投影操作。譬如: SELECTS#,SNAME FROMS WHERESEX='M';第二種情況:SELECT語句中未使用分組子句,但在SELECT子句中使用了聚合操作,此時(shí)SELECT子句的語義是對(duì)查詢結(jié)果執(zhí)行聚合操作。譬如: SELECTCOUNT(*),AVG(AGE) FROMS WHERESEX='M';該語句是求男同學(xué)的人數(shù)和平均年齡。第三種情況:SELECT語句使用了分組子句和聚合操作(有分組子句時(shí)必有聚合操作),此時(shí)SELECT子句的語義是對(duì)查詢結(jié)果的每一分組去做聚合操作。譬如: SELECTAGE,COUNT(*) FROMS WHERESEX='M'GROUPBYAGE;該語句是求男同學(xué)每一年齡的人數(shù)。4.SELECT語句中使用分組子句的先決條件是要有聚合操作。但執(zhí)行聚合操作不一定要用分組子句。譬如求男同學(xué)的人數(shù),此時(shí)聚合值只有一個(gè),因此不必分組。但同一個(gè)聚合操作的值有多個(gè)時(shí),必須使用分組子句。譬如求每一年齡的學(xué)生人數(shù)。此時(shí)聚合值有多個(gè),與年齡有關(guān),因此必須分組。3.2教材中習(xí)題3的解答3.1名詞解釋·基本表:實(shí)際存儲(chǔ)在數(shù)據(jù)庫中的表,稱為基本表?!ひ晥D:是從基本表或其他視圖中導(dǎo)出的表,它本身不獨(dú)立存儲(chǔ)在數(shù)據(jù)庫中,也就是數(shù)據(jù)庫中只存放視圖的定義而不存放視圖的數(shù)據(jù)?!?shí)表:是對(duì)基本表的別稱?!ぬ摫恚菏菍?duì)視圖的別稱?!は嚓P(guān)子查詢:SELECT語句嵌套時(shí),子查詢中查詢條件依賴于外層查詢中的值,因此子查詢要反復(fù)求值供外層查詢使用。這種子查詢稱為相關(guān)子查詢?!ぢ?lián)接查詢:查詢時(shí)要從多個(gè)基本表中提取數(shù)據(jù),此時(shí)把多個(gè)基本表寫在同一層的FROM子句中,這種查詢形式稱為聯(lián)接查詢。·嵌套查詢:查詢時(shí)要從多個(gè)基本表中提取數(shù)據(jù),此時(shí)把多個(gè)基本表分別放在不同層次上的FROM子句中,這種查詢形式稱為嵌套查詢?!そ换ナ絊QL:在終端交互方式使用的SQL語言?!で度胧絊QL:嵌入在高級(jí)語言的程序中使用的SQL語言?!す蚕碜兞浚呵度氲腟QL語句和主語言語句間傳遞信息的變量,稱為共享變量。共享變量先由主語言程序定義,再用SQL的說明語句說明,然后SQL語句就可使用這些變量?!び螛?biāo):游標(biāo)是與某一查詢相聯(lián)系的符號(hào)名。游標(biāo)有游標(biāo)關(guān)系和游標(biāo)指針兩層含義。在游標(biāo)打開時(shí),游標(biāo)(指針)指向查詢結(jié)果的第一個(gè)記錄之前?!ぞ碛螛?biāo):在游標(biāo)推進(jìn)時(shí),可以進(jìn)退自如的游標(biāo)。3.2對(duì)于教學(xué)數(shù)據(jù)庫的三個(gè)基本表S(S#,SNAME,AGE,SEX)SC(S#,C#,GRADE)C(C#,CNAME,TEACHER)試用SQL的查詢語句表達(dá)下列查詢:=1\*GB3①檢索LIU老師所授課程的課程號(hào)和課程名。=2\*GB3②檢索年齡大于23歲的男學(xué)生的學(xué)號(hào)和姓名。=3\*GB3③檢索學(xué)號(hào)為S3學(xué)生所學(xué)課程的課程名與任課教師名。=4\*GB3④檢索至少選修LIU老師所授課程中一門課程的女學(xué)生姓名。=5\*GB3⑤檢索WANG同學(xué)不學(xué)的課程的課程號(hào)。=6\*GB3⑥檢索至少選修兩門課程的學(xué)生學(xué)號(hào)。=7\*GB3⑦檢索全部學(xué)生都選修的課程的課程號(hào)與課程名。⑧檢索選修課程包含LIU老師所授課程的學(xué)生學(xué)號(hào)。解:① SELECTC#,CNAMEFROMCWHERETNAME=’LIU’;SELECTS#,SNAMEFROMSWHEREAGE>23ANDSEX=’M’;③ SELECTCNAME,TEACHERFROMSC,CWHERESC.C#=C.C#ANDS#=’S3’;④ SELECTSNAME (聯(lián)接查詢方式)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系統(tǒng)中,曾使用過“集合包含”的語法,即 (集合1)CONTAINS(集合2)用這種語法也能寫出本題的SELECT語句,即: SELECTC#,CNAME FROMC WHERE(SELECTS#FROMSCWHEREC#=C.C#) CONTAINS (SELECTS#FROMS); 由于判斷“(集合1)CONTAINS(集合2)”與“NOTEXISTS((集合2)EXCEPT(集合1))”是等價(jià)的,因此本題的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對(duì)于第3.2題中的8個(gè)查詢語句,試給出SELECT語句的圖示形式。解:為了說明問題,這里先用高級(jí)語言的算法形式表示其執(zhí)行過程,再給出圖示形式。下面給出④、⑤、⑦、⑧的算法及圖示形式。④如果把三個(gè)關(guān)系S、SC、C看成三個(gè)文件,那么可以看出這個(gè)查詢語句的SELECT語句實(shí)際上是一個(gè)三重循環(huán)。從而可得這個(gè)查詢的算法形式如下:for關(guān)系S的每個(gè)元組do {which:=false; ifS.SEX=’F’then for關(guān)系SC的每個(gè)元組,且NOTwhichdo ifSC.S#=S.S#then for關(guān)系C的每個(gè)元組,且NOTwhichdo ifC.C#=SC.C#,且TEACHER=’LIU’then {print(S.SNAME);which:=true;} }; 這個(gè)算法可以用圖3.1表示。SS#SNAMEAGESEXSCS#C#GRADECC#CNAMETEACHER_XP.F_X_Y_YLIU圖3.1⑤for關(guān)系S的每個(gè)元組do {ifS.SNAME=’WANG’thenfor關(guān)系C的每個(gè)元組do {which:=false; for關(guān)系SC的每個(gè)元組,且NOTwhichdo ifSC.S#=S.S#,且SC.C#=C.C#thenwhich:=true;ifNOTwhichthenprint(S.SNAME);}; 這個(gè)算法可以用圖3.2表示。圖中“┐”表示“NOTEXISTS”,即“不存在滿足此條件的元組”SS#SNAMEAGESEXCC#CNAMETEACHERSCS#C#GRADE_XWANGP._Y┐_X_Y圖3.2⑦for關(guān)系C的每個(gè)元組do {which1:=false; for關(guān)系S的每個(gè)元組,且NOTwhich1do{which2:=false;for關(guān)系SC的每個(gè)元組,且NOTwhich2doifSC.S#=S.S#,且SC.C#=C.C#thenwhich2:=true;ifNOTwhich2thenwhich1:=true;};ifNOTwhich1thenprint(C.C#,C.CNAME); }; 這個(gè)算法可以用圖3.3表示。CC#CNAMETEACHERSS#SNAMEAGESEXSCS#C#GRADEP._XP.┐_Y┐_Y_X圖3.3⑧for關(guān)系SC的每個(gè)元組xdo {which1:=false; for關(guān)系C的每個(gè)元組y,且NOTwhich1do{ify.TEACHER=’LIU’then {which2:=false;for關(guān)系SC的每個(gè)元組z,且NOTwhich2doifz.S#=x.S#,且z.C#=y.C#thenwhich2:=true;ifNOTwhich2thenwhich1:=true;};ifNOTwhich1thenprint(x.S#);}}; 這個(gè)算法可以用圖3.4表示。SCS#C#GRADECC#CNAMETEACHERSCS#C#GRADEP._XP.┐_YLIU┐_X_Y圖3.43.4設(shè)有兩個(gè)基本表R(A,B,C)和S(A,B,C),試用SQL查詢語句表達(dá)下列關(guān)系代數(shù)表達(dá)式:=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)的元組表達(dá)式如下:{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])}據(jù)此,可寫出SELECT語句: SELECTA,BFROMRRXWHERENOTEXISTS(SELECT*FROMSWHERENOTEXISTS(SELECT*FROMRRYWHERERY.A=RX.AANDRY.B=RX.BANDRY.C=S.C));3.5設(shè)有兩個(gè)關(guān)系R(A,B)和S(A,C),試用SQL查詢語句表示下列域表達(dá)式:①{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語言的關(guān)系代數(shù)特點(diǎn)和元組演算特點(diǎn)。答:SQL的關(guān)系代數(shù)特點(diǎn)如下:有關(guān)系代數(shù)運(yùn)算的并、交、差、自然聯(lián)接等運(yùn)算符;FROM子句體現(xiàn)了笛卡爾積操作,WHERE子句體現(xiàn)了選擇操作,SELECT子句體現(xiàn)了投影操作。SQL的元組演算特點(diǎn)如下:FROM子句中的基本表名應(yīng)視為“元組變量”,屬性名應(yīng)視為“元組分量”;有存在量詞EXISTS符號(hào)。3.7試用SQL查詢語句表達(dá)下列對(duì)3.2題中三個(gè)基本表S、SC、C的查詢:=1\*GB3①在表C中統(tǒng)計(jì)開設(shè)課程的教師人數(shù)。=2\*GB3②求選修C4課程的女學(xué)生的平均年齡。=3\*GB3③求LIU老師所授課程的每門課程的平均成績(jī)。=4\*GB3④統(tǒng)計(jì)每個(gè)學(xué)生選修課程的門數(shù)(超過5門的學(xué)生才統(tǒng)計(jì))。要求輸出學(xué)生學(xué)號(hào)和選修門數(shù),查詢結(jié)果按門數(shù)降序排列,若門數(shù)相同,按學(xué)號(hào)升序排列。=5\*GB3⑤檢索學(xué)號(hào)比WANG同學(xué)大,而年齡比他小的學(xué)生姓名。=6\*GB3⑥在表SC中檢索成績(jī)?yōu)榭罩档膶W(xué)生學(xué)號(hào)和課程號(hào)。=7\*GB3⑦檢索姓名以L打頭的所有學(xué)生的姓名和年齡。=8\*GB3⑧求年齡大于女同學(xué)平均年齡的男學(xué)生姓名和年齡。=9\*GB3⑨求年齡大于所有女同學(xué)年齡的男學(xué)生姓名和年齡。解:=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對(duì)于下面的關(guān)系R和S,試求出下列各種聯(lián)接操作的執(zhí)行結(jié)果:① RNATURALINNERJOINS② RNATURALRIGHTOUTERJOINS③ RRIGHTOUTERJOINSUSING(C)④ RINNERJOINS⑤ RFULLOUTERJOINSONfalseRABCSBCDa1b1c1b1c1d1a2b2c2b2c2d2a3b3c3b4c4d4解:①ABCD②ABCD③AR.BCS.BDa1b1c1d1a1b1c1d1a1b1c1b1d1a2b2c2d2a2b2c2d2a2b2c2b2d2nullb4c4d4nullnullc4b4d4④AR.BR.CS.BS.CD⑤AR.BR.CS.BS.CDa1b1c1b1c1d1a1b1c1nullnullnulla1b1c1b2c2d2a2b2c2nullnullnulla1b1c1b4c4d4a3b3c3nullnullnulla2b2c2b1c1d1nullnullnullb1c1d1a2b2c2b2c2d2nullnullnullb2c2d2a2b2c2b4c4d4nullnullnullb4c4d4a3b3c3b1c1d1a3b3c3b2c2d2a3b3c3b4c4d43.9SQL2提供CASE表達(dá)式操作,這個(gè)操作類似于程序設(shè)計(jì)語言中的多分支選擇結(jié)構(gòu),其句法如下: CASE WHEN條件1THEN結(jié)果1 WHEN條件2THEN結(jié)果2…… WHEN條件nTHEN結(jié)果nELSE結(jié)果m END如果自上而下“條件i”首先被滿足,那么這個(gè)操作返回值“結(jié)果i”(可以是某個(gè)表達(dá)式的值);如果沒有一個(gè)條件被滿足,那么返回值“結(jié)果m”。 在基本表SC(S#,C#,GRADE)中,GRADE值是百分制。如果欲轉(zhuǎn)換成“成績(jī)等第”,則規(guī)則如下:若GRADE<40則等第為F,若40≤GRADE<60則等第為C,若60≤GRADE<80則等第為B,若80≤GRADE則等第為A。試寫出下列兩個(gè)查詢語句:①檢索每個(gè)學(xué)生的學(xué)習(xí)成績(jī),成績(jī)顯示時(shí)以等第(SCORE)形式出現(xiàn)。②檢索每個(gè)等第的學(xué)生人次數(shù)。解:①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表中的元組更新:①若課程號(hào)為C5則增加6分,若課程號(hào)為C8則增加10分,其他一律增加5分。②若C4課程的成績(jī)低于該門課平均成績(jī)時(shí),提高5%,否則提高4%。解:①UPDATESCSETGRADE=GRADE+CASEWHENC#='C5'THEN6WHENC#='C8'THEN10ELSE5END;②UPDATESCSETGRADE=GRADE*CASEWHENGRADE<(SELECTAVG(GRADE)FROMSCWHEREC#='C4')THEN1.05ELSE1.04ENDWHEREC#='C4';3.11設(shè)零件之間有組合聯(lián)系,其關(guān)系模式如下:PART(P#,PNAME,SUBP#,TOTAL)其屬性表示零件編號(hào)、零件名稱、所需子零件編號(hào)及數(shù)量。設(shè)臨時(shí)關(guān)系W(P#,SUBP#)的屬性分別表示零件編號(hào)、這種零件的直接或間接子零件編號(hào)。①試寫出表示關(guān)系W的規(guī)則。②寫出計(jì)算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更新語句表達(dá)對(duì)3.2題教學(xué)數(shù)據(jù)庫中關(guān)系S、SC、C的更新操作:=1\*GB3①往關(guān)系C中插一個(gè)課程元組('C8','VC++','BAO')。=2\*GB3②檢索所授每門課程平均成績(jī)均大于80分的教師姓名,并把檢索到的值送往另一個(gè)已存在的表FACULTY(TNAME)。=3\*GB3③在SC中刪除尚無成績(jī)的選課元組。=4\*GB3④把選修LIU老師課程的女同學(xué)選課元組全部刪去。=5\*GB3⑤把MATHS課不及格的成績(jī)?nèi)臑?0分。=6\*GB3⑥把低于所有課程總平均成績(jī)的女同學(xué)成績(jī)提高5%。=7\*GB3⑦在表SC中修改C4課程的成績(jī),若成績(jī)小于等于70分時(shí)提高5%,若成績(jī)大于70 分時(shí)提高4%(用兩種方法實(shí)現(xiàn),一種方法是用兩個(gè)UPDATE語句實(shí)現(xiàn),另一種方法是用帶CASE操作的一個(gè)UPDATE語句實(shí)現(xiàn))。⑧在表SC中,當(dāng)某個(gè)成績(jī)低于全部課程的平均成績(jī)時(shí),提高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);⑦用兩個(gè)UPDATE語句實(shí)現(xiàn):UPDATESCSETGRADE=GRADE*1.04WHEREC#='C4'ANDGRADE>70;UPDATESCSETGRADE=GRADE*1.05WHEREC#='C4'ANDGRADE<=70;(這兩個(gè)UPDATE語句的順序不能顛倒。)用一個(gè)UPDATE語句實(shí)現(xiàn):UPDATESCSETGRADE=GRADE*CASEWHENGRADE>70THEN1.04ELSE1.05ENDWHEREC#='C4';⑧UPDATESC SETGRADE=GRADE*1.05 WHEREGRADE<(SELECTAVG(GRADE) FROMSC);3.13設(shè)數(shù)據(jù)庫中有三個(gè)關(guān)系: 職工表 EMP(E#,ENAME,AGE,SEX,ECITY),其屬性分別表示職工工號(hào)、姓名、年齡、性別和籍貫。工作表 WORKS(E#,C#,SALARY),其屬性分別表示職工工號(hào)、工作的公司編號(hào)和工資。公司表 COMP(C#,CNAME,CITY),其屬性分別表示公司編號(hào)、公司名稱和公司所在城市。試用SQL語句寫出下列操作:①用CREATETABLE語句創(chuàng)建上述三個(gè)表,需指出主鍵和外鍵。②檢索超過50歲的男職工的工號(hào)和姓名。③假設(shè)每個(gè)職工只能在一個(gè)公司工作,檢索工資超過1000元的男性職工工號(hào)和姓名。④假設(shè)每個(gè)職工可在多個(gè)公司工作,檢索在編號(hào)為C4和C8公司兼職的職工工號(hào)和姓名。⑤檢索在“聯(lián)華公司”工作、工資超過1000元的男性職工的工號(hào)和姓名。⑥假設(shè)每個(gè)職工可在多個(gè)公司工作,檢索每個(gè)職工的兼職公司數(shù)目和工資總數(shù).顯示(E#,NUM,SUM_SALARY),分別表示工號(hào)、公司數(shù)目和工資總數(shù)。⑦工號(hào)為E6的職工在多個(gè)公司工作,試檢索至少在E6職工兼職的所有公司工作的職工工號(hào)。⑧檢索聯(lián)華公司中低于本公司平均工資的職工工號(hào)和姓名。⑨在每一公司中為50歲以上職工加薪100元(若職工為多個(gè)公司工作,可重復(fù)加)。⑩在EMP表和WORKS表中刪除年齡大于60歲的職工有關(guān)元組。解:① 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='聯(lián)華公司'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='聯(lián)華公司'ANDSALARY<(SELECTAVG(SALARY)FROMWORKS,COMPWHEREWORKS.C#=COMP.C#ANDCNAME='聯(lián)華公司');⑨ UPDATEWORKSSETSALARY=SALARY+100WHEREE#IN(SELECTE#FROMEMPWHEREAGE>50);⑩ DELETEFROMWORKS WHEREE#IN(SELECTE#FROMEMPWHEREAGE>60); DELETEFROMEMP WHEREAGE>60;3.14對(duì)第3.13題中的關(guān)系建立一個(gè)有關(guān)女職工信息的視圖EMP_WOMAN,屬性包括(E#,ENAME,C#,CNAME,SALARY)。然后對(duì)視圖EMP_WOMAN操作,檢索每一位女職工的工資總數(shù)。(假設(shè)每個(gè)職工可在多個(gè)公司兼職)解: 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章中提到的倉庫管理數(shù)據(jù)庫中有五個(gè)基本表: 零件 PART(P#,PNAME,COLOR,WEIGHT) 項(xiàng)目 PROJECT(J#,JNAME,DATE) 供應(yīng)商 SUPPLIER(S#,SNAME,SADDR) 供應(yīng) P_P(J#,P#,TOTAL) 采購 P_S(P#,S#,QUANTITY) ①試用SQLDDL語句定義上述五個(gè)基本表,需說明主鍵和外鍵。②試將PROJECT、P_P、PART三個(gè)基本表的聯(lián)接定義為一個(gè)視圖VIEW1,將PART、P_S、SUPPLIER三個(gè)基本表的聯(lián)接定義為一個(gè)視圖VIEW2。③試在上述兩個(gè)視圖的基礎(chǔ)上進(jìn)行查詢操作:a)檢索上海的供應(yīng)商所供應(yīng)的零件的編號(hào)和名稱。b)檢索項(xiàng)目J4所用零件的供應(yīng)商的編號(hào)和名稱。解:① 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對(duì)于3.2題的教學(xué)數(shù)據(jù)庫中基本表SC,建立一個(gè)視圖: CREATEVIEWS_GRADE(S#,C_NUM,AVG_GRADE) ASSELECTS#,COUNT(C#),AVG(GRADE) FROMSC GROUPBYS#; 試判斷下列查詢和更新操作是否允許執(zhí)行。如允許,寫出轉(zhuǎn)換到基本表SC上的相應(yīng)操作。 ① 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;答:①允許查詢。相應(yīng)的操作如下: SELECTS#,COUNT(C#)ASC_NUM,AVG(GRADE)ASAVG_GRADE FROMSC GROUPBYS#;②允許查詢。相應(yīng)的操作如下: SELECTS#,COUNT(C#)ASC_NUM FROMSC GROUPBYS#HAVINGAVG(GRADE)>80;③允許查詢。相應(yīng)的操作如下: SELECTS#,AVG(GRADE)ASAVG_GRADE FROMSC GROUPBYS#HAVINGCOUNT(C#)>(SELECTCOUNT(C#)FROMSCGROUPBYS#HAVINGS#='S4');④不允許。C_NUM是對(duì)SC中的學(xué)生選修門數(shù)進(jìn)行統(tǒng)計(jì),在未更改SC表時(shí),要在視圖S_GRADE中更改門數(shù),是不可能的。⑤不允許。在視圖S_GRADE中刪除選修門數(shù)在4門以上的學(xué)生元組,勢(shì)必造成SC中這些學(xué)生學(xué)習(xí)元組的刪除,這不一定是用戶的原意,因此使用分組和聚合操作的視圖,不允許用戶執(zhí)行更新操作。3.17預(yù)處理方式對(duì)于嵌入式SQL的實(shí)現(xiàn)有什么重要意義?答:此時(shí)宿主語言的編譯程序不必改動(dòng),只要提供一個(gè)SQL函數(shù)定義庫,供編譯時(shí)使用。預(yù)處理方式只是把源程序中的SQL語句處理成宿主語言的函數(shù)調(diào)用形式。3.18在宿主語言的程序中使用SQL語句有哪些規(guī)定?答:有三條規(guī)定:①在程序中要區(qū)分SQL語句與宿主語言語句,所有SQL語句必須加前綴標(biāo)識(shí)“EXECSQL”以及結(jié)束標(biāo)志“END_EXEC”;②允許嵌入的SQL語句引用宿主語言的程序變量,而主語句不能引用數(shù)據(jù)庫中的字段變量;③SQL的集合處理方式與宿主語言的單記錄處理方式之間要用游標(biāo)機(jī)制協(xié)調(diào)。3.19SQL的集合處理方式與宿主語言單記錄處理方式之間如何協(xié)調(diào)?答:用游標(biāo)機(jī)制協(xié)調(diào)。把SELECT語句查詢結(jié)果定義成游標(biāo)關(guān)系,以使用文件的方式來使用游標(biāo)關(guān)系。與游標(biāo)有關(guān)的SQL語句有四個(gè):游標(biāo)定義,游標(biāo)打開,游標(biāo)推進(jìn),游標(biāo)關(guān)閉。3.20嵌入式SQL的DML語句何時(shí)不必涉及到游標(biāo)?何時(shí)必須涉及到游標(biāo)?答:不涉及游標(biāo)的DML語句有下面兩種情況: ①INSERT、DELETE、UPDATE語句,只要加上前綴和結(jié)束標(biāo)志,就能嵌入在宿主語言程序中使用;②對(duì)于SELECT語句,如果已知查詢結(jié)果肯定是單元值,也可不必涉及游標(biāo)操作。涉及游標(biāo)的DML語句有下面兩種情況:①當(dāng)SELECT語句查詢結(jié)果是多個(gè)元組時(shí),必須用游標(biāo)機(jī)制把多個(gè)元組一次一個(gè)地傳遞給主程序處理;②對(duì)游標(biāo)指向元組進(jìn)行修改或刪除操作時(shí),也涉及到游標(biāo)。3.21在教學(xué)數(shù)據(jù)庫中檢索成績(jī)不及格的學(xué)生信息,要求顯示(S#,SNAME,C#,CNAME,TEACHER),試編寫實(shí)現(xiàn)此功能的嵌有SQL語句的C語言程序段。解: #defineNO_MORE_TUPLES ?。╯trcmp(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練習(xí)題3.3.1填空題1.在SQL中,關(guān)系模式稱為__________,子模式稱為__________,元組稱為__________,屬性稱為__________。2.SQL中,表有兩種:__________和__________,也稱為__________和__________。3.SQL中,用戶有兩種:__________和__________。4.SQL中,外模式一級(jí)數(shù)據(jù)結(jié)構(gòu)的基本單位是__________。5.在“SQL模式”中,主要成分有__________。6.基本表中,“主鍵”概念應(yīng)該體現(xiàn)其值的__________和__________兩個(gè)特征。7.操作“元組IN(集合)”的語義是____________________。8.表達(dá)式中的通配符“%”表示__________,“_”(下劃線)表示__________。9.操作“元組>SOME(集合)”的語義是____________________。10.操作“元組<ALL(集合)”的語義是____________________。11.SQL有兩種使用方式:__________和__________。12.嵌入式SQL的預(yù)處理方式,是指預(yù)處理程序先對(duì)源程序進(jìn)行掃描,識(shí)別出__________,并處理成宿主語言的__________形式。13.為保證嵌入式SQL的實(shí)現(xiàn),通常DBMS制造商提供一個(gè)__________,供編譯時(shí)使用。14.SQL語句嵌入在C語言程序中時(shí),必須加上前綴標(biāo)識(shí)__________和結(jié)束標(biāo)志__________。15.“卷游標(biāo)”是指____________________。3.3.2單項(xiàng)選擇題(在備選答案中選出一個(gè)正確答案)1.在SQL中,用戶可以直接進(jìn)行查詢操作的是 [ ] A.實(shí)表和虛表 B.基本表和實(shí)表C.視圖和虛表 D.基本表2.SQL中,聚合函數(shù)COUNT(列名)用于 [ ] A.計(jì)算元組個(gè)數(shù) B.計(jì)算屬性的個(gè)數(shù)C.對(duì)一列中的非空值計(jì)算個(gè)數(shù) D.對(duì)一列中的非空值和空值計(jì)算個(gè)數(shù)3.SQL中,與“NOTIN”等價(jià)的操作符是 [ ] 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可用來測(cè)試一個(gè)集合是否 [ ] A.有重復(fù)元組 B.有重復(fù)的列名C.為非空集合 D.有空值6.對(duì)于基本表EMP(ENO,ENAME,SALARY,DNO)其屬性表示職工的工號(hào)、姓名、工資和所在部門的編號(hào)。 基本表DEPT(DNO,DNAME) 其屬性表示部門的編號(hào)和部門名。有一SQL語句: SELECTCOUNT(DISTINCTDNO) FROMEMP;其等價(jià)的查詢語句是 [ ] A.統(tǒng)計(jì)職工的總?cè)藬?shù) B.統(tǒng)計(jì)每一部門的職工人數(shù)C.統(tǒng)計(jì)職工服務(wù)的部門數(shù)目 D.統(tǒng)計(jì)每一職工服務(wù)的部門數(shù)目7.對(duì)于第6題的兩個(gè)基本表,有一個(gè)SQL語句: SELECTENO,ENAME FROMEMP WHEREDNONOTIN (SELECTDNO FROMDEPT WHEREDNAME='金工車間';其等價(jià)的關(guān)系代數(shù)表達(dá)式是: [ ] 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.對(duì)于第6題的兩個(gè)基本表,有一個(gè)SQL語句: UPDATEEMP SETSALARY=SALARY*1.05 WHEREDNO='D6' ANDSALARY<(SELECTAVG(SALARY)FROMEMP);其等價(jià)的修改語句為 [ ] A.為工資低于D6部門平均工資的所有職工加薪5%B.為工資低于整個(gè)企業(yè)平均工資的職工加薪5%C.為在D6部門工作、工資低于整個(gè)企業(yè)平均工資的職工加薪5%D.為在D6部門工作、工資低于本部門平均工資的職工加薪5%9.有關(guān)嵌入式SQL的敘述,不正確的是 [ ] A.宿主語言是指C一類高級(jí)程序設(shè)計(jì)語言B.宿主語言是指SQL語言C.在程序中要區(qū)分SQL語句和宿主語言語句D.SQL有交互式和嵌入式兩種使用方式10.嵌入式SQL實(shí)現(xiàn)時(shí),采用預(yù)處理方式是 [ ] A.把SQL語句和主語言語句區(qū)分開來B.為SQL語句加前綴標(biāo)識(shí)和結(jié)束標(biāo)志C.識(shí)別出SQL語句,并處理成函數(shù)調(diào)用形式D.把SQL語句編譯成二進(jìn)制碼11.允許在嵌入的SQL語句中,引用宿主語言的程序變量,在引用時(shí) [ ] A.直接引用B.這些變量前必須加符號(hào)“*”C.這些變量前必須加符號(hào)“:”D.這些變量前必須加符號(hào)“&”12.如果嵌入的SELECT語句的查詢結(jié)果肯定是單元組,那么嵌入時(shí) [ ] A.肯定不涉及游標(biāo)機(jī)制B.必須使用游標(biāo)機(jī)制C.是否使用游標(biāo),由應(yīng)用程序員決定D.是否使用游標(biāo),與DBMS有關(guān)13.卷游標(biāo)的推進(jìn)語句“EXECSQLFETCHRELATIVE-4”表示 [ ] A.把游標(biāo)移向查詢結(jié)果的第4行B.把游標(biāo)移向查詢結(jié)果的倒數(shù)第4行C.把游標(biāo)從當(dāng)前位置推進(jìn)4行D.把游標(biāo)從當(dāng)前位置返回4行14.卷游標(biāo)的推進(jìn)語句“EXECSQLFETCHABSOLUTE-3 ”表示 [ ] A.把游標(biāo)移向查詢結(jié)果的第3行B.把游標(biāo)移向查詢結(jié)果的倒數(shù)第3行C.把游標(biāo)從當(dāng)前位置推進(jìn)3行D.把游標(biāo)從當(dāng)前位置返回3行3.3.3簡(jiǎn)答題1.試敘述SQL的關(guān)系代數(shù)特點(diǎn)和元組演算特點(diǎn)。2.SQL語言對(duì)于“查詢結(jié)果是否允許存在重復(fù)元組”是如何實(shí)現(xiàn)的?3.試對(duì)SELECT語句中使用的基本表名和列名的語義作詳細(xì)的解釋。4.SELECT語句中,何時(shí)使用分組子句,何時(shí)不必使用分組子句?3.4練習(xí)題答案3.4.1填空題答案1.基本表視圖行列2.基本表視圖實(shí)表虛表3.應(yīng)用程序終端用戶4.視圖5.基本表、視圖、索引、完整性規(guī)則等6.惟一非空7.若元組在集合中,其值為true,否則為false8.與零個(gè)或多個(gè)字符組成的字符串匹配與單個(gè)字符匹配9.若元組值大于集合中某一元組值,則其值為true,否則為false10.若元組值小于集合中每一元組值,則其值為true,否則為false11.交互式SQL嵌入式SQL12.SQL語句函數(shù)調(diào)用13.SQL函數(shù)定義庫14.EXECSQL分號(hào)(;)15.可以進(jìn)退自如的游標(biāo)(即可隨意推進(jìn)或返回)3.4.2單項(xiàng)選擇題答案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簡(jiǎn)答題答案1.答:SQL的SELECT語句的基本句法來自于關(guān)系代數(shù)表達(dá)式πL(σF(R1×…×Rm)),并且SQL中有并(UNION)、交(INTERSECT)和差(EXCEPT)等操作,因此SQL具有關(guān)系代數(shù)特點(diǎn)。 SELECT語句中出現(xiàn)的基本表名,都應(yīng)該理解成基本表中的元組變量,而列名應(yīng)理解成元組分量,這樣SQL就具有了元組演算的特點(diǎn)。2.答:對(duì)于SELECT語句中SELECT子句,若用“SELECTDISTINCT”形式,則查詢結(jié)果中不允許有重復(fù)元組;若不寫DISTINCT字樣,則查詢結(jié)果中允許出現(xiàn)重復(fù)元組。3.答:在基本SQL中,SELECT語句中使用的基本表名都應(yīng)該理解成表中的元組變量,而列名就成了元組分量。這樣就使SELECT語句帶有元組演算的特點(diǎn)。(注:實(shí)際上,在基本SQL中,把關(guān)系變量和元組變量混為一談了。這在面向?qū)ο髷?shù)據(jù)庫中得到了糾正,在引用表時(shí),都要為表定義一個(gè)元組變量。)4.答:SELECT語句中使用分組子句的先決條件是要有聚合操作。當(dāng)聚合操作值與其他屬性的值無關(guān)時(shí),不必使用分組子句。譬如求男同學(xué)的人數(shù)。此時(shí)聚合值只有一個(gè),因此不必分組。 當(dāng)聚合操作值與其他屬性的值有關(guān)時(shí),必須使用分組子句。譬如求每一性別的人數(shù)。此時(shí)聚合值有兩個(gè),與性別有關(guān),因此必須分組。第4章模式設(shè)計(jì)理論4.1基本知識(shí)點(diǎn)4.1.1本章重要概念(1)關(guān)系模式的冗余和異常問題。(2)FD的定義、邏輯蘊(yùn)涵、閉包、推理規(guī)則、與關(guān)鍵碼的聯(lián)系;平凡的FD;屬性集的閉包;推理規(guī)則的正確性和完備性;FD集的等價(jià);最小依賴集。(3)無損分解的定義、性質(zhì)、測(cè)試;保持依賴集的分解。(4)關(guān)系模式的范式:1NF,2NF,3NF,BCNF。分解成2NF、3NF模式集的算法。(5)MVD、4NF、JD和5NF的定義。4.1.2本章的重點(diǎn)篇幅 (1)教材中P148的例4.13。(無損聯(lián)接和保持FD的例子) (2)教材中P149的例4.14和P150的例4.15。(分解成2NF和3NF的例子)4.2教材中習(xí)題4的解答4.1名詞解釋·數(shù)據(jù)冗余:指同一個(gè)數(shù)據(jù)在系統(tǒng)中多次重復(fù)出現(xiàn)。·函數(shù)依賴(FD):在關(guān)系模式R(U)中,F(xiàn)D是形為X→Y的一個(gè)命題,只要r是R的當(dāng)前關(guān)系,對(duì)r中任意兩個(gè)元組t和s,都有t[X]=s[X]蘊(yùn)涵t[Y]=s[Y],那么稱FDX→Y在關(guān)系模式R(U)中成立。·平凡的FD:如果X→Y,且Y?X,則稱X→Y是一個(gè)“平凡的FD”?!D集F的閉包F+:被F邏輯蘊(yùn)涵的函數(shù)依賴全體構(gòu)成的集合,稱為F的閉包,記為F+,即F+={X→Y|F?X→Y}?!傩约疿的閉包X+:從已知的FD集F使用FD推理規(guī)則推出的所有滿足X→A的屬性A的集合,稱為X的閉包,記為X+,即X+={屬性A|X→A在F+中}?!D的邏輯蘊(yùn)涵:如果從已知的FD集F能推導(dǎo)出X→Y成立,那么稱F邏輯蘊(yùn)涵X→Y,記為F?X→Y?!D集的等價(jià):對(duì)于兩個(gè)FD集F和G,有F+=G+,則稱F和G是等價(jià)的依賴集。·最小依賴集:設(shè)F是屬性集U上的FD集,F(xiàn)min是F的最小依賴集,那么Fmin應(yīng)滿足下列四個(gè)條件:Fmin+=F+;每個(gè)FD的右邊都是單屬性;Fmin中沒有冗余的FD;每個(gè)FD的左邊沒有冗余的屬性。ki=1·無損分解:設(shè)關(guān)系模式R,F(xiàn)是R上的FD集,ρ={R1,…,Rk}是R的一個(gè)分解。如果對(duì)R中滿足F的每一關(guān)系r,都有r=?πRi(r),那么稱分解ρ相對(duì)F是“無損分解”ki=1·泛關(guān)系假設(shè):指數(shù)據(jù)庫中每一個(gè)關(guān)系都是全部屬性構(gòu)成的關(guān)系的投影,此時(shí),由全部屬性構(gòu)成的關(guān)系稱為泛關(guān)系?!hase過程:根據(jù)已知FD集,對(duì)R分解成ρ構(gòu)造的初始表格的值進(jìn)行修改,使之符合FD集,這個(gè)過程稱為chase過程。ki=1·保持FD:設(shè)關(guān)系模式R,F(xiàn)是R上的FD分解,ρ={R1,…,Rk}是R的一個(gè)分解,如果有∪πRi(F)?F,那么稱分解ρ保持FD集Fki=1·1NF:如果關(guān)系模式R的每個(gè)關(guān)系r的屬性值都是不可分的原子值,那么稱R是1NF的模式?!?NF:如果R是1NF的模式,且每個(gè)非主屬性完全函數(shù)依賴于R的候選鍵,那么稱R是2NF的模式?!?NF:如果R是1NF的模式,且每個(gè)非主屬性都不傳遞依賴于R的候選鍵,那么稱R是3NF的模式。·BCNF:如果R是1NF的模式,且每個(gè)屬性都不傳遞依賴于R的候選鍵,那么稱R是BCNF的模式?!?NF:設(shè)D是關(guān)系模式R上成立的FD和MVD集合。如果D中每個(gè)非平凡的MVDX→→Y的左部X都是R的超鍵,那么稱R是4NF模式?!?NF:如果關(guān)系模式R的每個(gè)JD均由R的候選鍵蘊(yùn)涵,那么稱R是5NF的模式?!ざ嘀狄蕾嚕∕VD):設(shè)關(guān)系模式R(U),X和Y是U的子集,Z=U-X-Y。對(duì)于R的關(guān)系r,若在r中存在元組(x,y1,z1)和(x,y2,z2),就也應(yīng)存在元組(x,y2,z1)和(x,y1,z2),那么稱MVDX→→Y在模式R上成立?!ぢ?lián)接依賴(JD):設(shè)關(guān)系模式R(U),R1、…、Rn是U的子集,并滿足U=R1∪…∪Rn,ρ={R1,…,Rn}是R的一個(gè)分解。如果對(duì)于R的每個(gè)關(guān)系r都有mρ(r)=r,那么稱JD*(R1,…,Rn)在模式R上成立。4.2用A1、A2和A3三條推理規(guī)則來證明4.2.3節(jié)中的定理4.2(推理規(guī)則A4~A8)。(1)A4(合并性,union):{X→Y,X→Z}?X→YZ。證明:已知X→Y,根據(jù)A2,兩邊用X擴(kuò)充,得到X→XY。從已知X→Z,根據(jù)A2兩邊用Y擴(kuò)充,得到XY→YZ。再根據(jù)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,根據(jù)A2,兩邊用W擴(kuò)充,得到WX→WY。據(jù)WX→WY和已知的WY→Z,。再根據(jù)A3,可得WX→Z成立。(4)A7(復(fù)合性,composition):{X→Y,W→Z}?XW→YZ。證明:已知X→Y,根據(jù)A2,兩邊用W擴(kuò)充,得到WX→WY。從已知W→Z,根據(jù)A2兩邊用Y擴(kuò)充,得到WY→YZ。再根據(jù)A3,從WX→WY和WY→YZ可得到XW→YZ成立。(5)A8{X→Y,W→Z}?X∪(W-Y)→YZ。證明:已知X→Y,根據(jù)A2,兩邊用(W-Y)擴(kuò)充,得到X∪(W-Y)→Y∪(W-Y),而Y∪(W-Y)=WY,因此有X∪(W-Y)→WY。從已知W→Z,根據(jù)A2兩邊用Y擴(kuò)充,得到WY→YZ。再根據(jù)A3,從X∪(W-Y)→WY和WY→YZ可得到X∪(W-Y)→YZ。4.3對(duì)函數(shù)依賴X→Y的定義加以擴(kuò)充,X和Y可以為空屬性集,用φ表示,那么X→φ,φ→Y,φ→φ的含義是什么?答:據(jù)推理規(guī)則的自反律可知,Xф和фф是平凡的FD,總是成立的。而фY表示在當(dāng)前關(guān)系中,任意兩個(gè)元組的Y值相等,也就是當(dāng)前關(guān)系的Y值都相等。4.4設(shè)關(guān)系模式R有n個(gè)屬性,在模式R上可能成立的函數(shù)依賴有多少個(gè)?其中平凡的FD有多少個(gè)?非平凡的FD有多少個(gè)?解:這個(gè)問題是排列組合問題。FD形為XY,從n個(gè)屬性值中選擇屬性組成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形式應(yīng)該有2n·2n=4n種方法。即可能成立的FD有4n個(gè)。平凡的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個(gè)。4.5已知關(guān)系模式R(ABC),F(xiàn)是R上成立的FD集,F(xiàn)={A→B,B→C},試寫出F的閉包F+。解:據(jù)已知條件和推理規(guī)則,可知F+有43個(gè)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設(shè)關(guān)系模式R(ABCD),F(xiàn)是R上成立的FD集,F(xiàn)={A→B,C→B},則相對(duì)于F,試寫出關(guān)系模式R的關(guān)鍵碼。并說明理由。解:R的關(guān)鍵碼為ACD。因?yàn)閺囊阎腇,只能推出ACD→ABCD。4.7設(shè)關(guān)系模式R(ABCD)上FD集為F,并且F={AB→C,C→D,D→A}。 ①試從F求出所有非平凡的FD。②試求R的所有候選鍵。③試求R的所有不是候選鍵的超鍵。 解:①從已知的F可求出非平凡的FD有76個(gè)。 譬如,左邊是C的FD有6個(gè):C→A,C→D,C→AD,C→AC,C→CD,C→ACD。 左邊是D的FD有2個(gè):D→A,D→AD。左邊是AB的FD有12個(gè):AB→C,AB→D,AB→CD,AB→AC,……。 感興趣的讀者可以自行把這76個(gè)FD寫齊。②候選鍵是能函數(shù)決定所有屬性的不含多余屬性的屬性集。根據(jù)這個(gè)概念可求出R的候選鍵有三個(gè):AB、BC和BD。③R的所有不是候選鍵的超鍵有四個(gè):ABC、ABD、BCD和ABCD。4.8試舉出反例說明下列規(guī)則不成立:①{A→B}?{B→A}②{AB→C,A→C}?{B→C}③{AB→C}?{A→C}答:設(shè)有三個(gè)關(guān)系: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)在關(guān)系r1中,A→B成立,但B→A不成立。(2)在關(guān)系r2中,AB→C和A→C成立,但B→C不成立(3)在關(guān)系r3中,AB→C成立,但A→C不成立。4.9設(shè)關(guān)系模式R(ABCD),F(xiàn)是R上成立的FD集,F(xiàn)={A→B,B→C},試寫出屬性集BD的閉包(BD)+。試寫出所有左部是B的函數(shù)依賴(即形為“B→?”)。解:①從已知的F,可推出BD→BCD,所以(BD)+=BCD。②由于B+=BC,因此左部是B的FD有四個(gè):B→φ,B→B,B→C,B→BC。4.10設(shè)關(guān)系模式R(ABCDE)上FD集為F,并且F={A→BC,CD→E,B→D,E→A}。①試求R的候選鍵。②試求B+的值。解:①R的候選鍵有四個(gè):A、E、CD和BC。②B+=BD。4.11設(shè)有關(guān)系模式R(ABC),其關(guān)系r如圖4.1所示。①試判斷下列三個(gè)FD在關(guān)系r中是否成立?A→B BC→A B→A②根據(jù)關(guān)系r,你能斷定哪些FD在關(guān)系模式R上不成立?ABC123423533
圖4.1解:①在關(guān)系r中,A→B成立,BC→A不成立,B→A不成立。 ②在關(guān)系r中,不成立的FD有:B→A,C→A,C→B,C→AB,BC→A。4.12設(shè)關(guān)系模式R(ABC)分解成ρ={AB,BC},如果R上的FD集F={A→B},那么這個(gè)分解是損失分解。試舉出R的一個(gè)關(guān)系r,不滿足mρ(r)=r。解:這個(gè)反例r可以舉測(cè)試時(shí)的初始表格: A B C AB a1 a2 b13 BC b21 a2 a3πAB(r)?πBC(r)有四個(gè)元組: A B C a1 a2 b13 a1 a2 a3 b21 a2 b13 b21 a2 a3 即mρ(r)≠r。4.13試解釋數(shù)據(jù)庫“丟失信息”與“未丟失信息”兩個(gè)概念。“丟失信息”與“丟失數(shù)據(jù)”有什么區(qū)別?答:數(shù)據(jù)庫中丟失信息是指r≠mρ(r),未丟失信息是指r=mρ(r)。 丟失信息是指不能辨別元組的真?zhèn)?,而丟失數(shù)據(jù)是指丟失元組。4.14設(shè)關(guān)系模式R(ABC),F(xiàn)是R上成立的FD集,F(xiàn)={A→C,B→C},試分別求F在模式AB和AC上的投影。答:πAB(F)=φ(即不存在非平凡的FD) πAC(F)={A→C}4.15設(shè)關(guān)系模式R(ABC),F(xiàn)是R上成立的FD集,F(xiàn)={B→A,C→A},ρ={AB,BC}是R上的一個(gè)分解,那么分解ρ是否保持FD集F?并說明理由。答:已知F={B→A,C→A},而πAB(F)={B→A},πBC(F)=φ, 顯然,分解ρ丟失了FDC→A。4.16設(shè)關(guān)系模式R(ABC),F(xiàn)是R上成立的FD集,F(xiàn)={B→C,C→A},那么分解ρ={AB,AC}相對(duì)于F,是否無損分解和保持FD?并說明理由。答:①已知F={B→C,C→A},而πAB(F)=φ,πAC(F)={C→A}顯然,這個(gè)分解丟失了FDB→C②用測(cè)試過程可以知道,ρ相對(duì)于F是損失分解。4.17設(shè)關(guān)系模式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,這個(gè)分解有什么冗余和異常現(xiàn)象?④用ρ2={DG,AC,CDE,AB}替換R,這個(gè)分解是無損分解嗎?⑤用ρ3={CDE,AC,DG,BCD}替換R,先求F在ρ3的每個(gè)模式上的投影πRi(F),再判斷分解ρ3保持FD嗎?解:①D+=DG,C+=ABC,A+=AB,(CD)+=ABCDEG,(AD)+=ABDG,(AC)+=ABC,(ACD)+=ABCDEG。②R的候選鍵只有一個(gè):CD。③用ρ1={CDEG,ABC}替換R,在模式CDEG中,有局部依賴CD→G,此時(shí)在關(guān)系中,一個(gè)D值只有一個(gè)G值,但當(dāng)這個(gè)D值與10個(gè)C值對(duì)應(yīng)時(shí),就要出現(xiàn)10個(gè)元組,則G值就要重復(fù)10次。在模式ABC中,有傳遞依賴(C→A和A→B),此時(shí)在關(guān)系中,一個(gè)A值只有一個(gè)B值,但當(dāng)這個(gè)A值與10個(gè)C值對(duì)應(yīng)時(shí),就要出現(xiàn)10個(gè)元組,則B值就要重復(fù)10次。④用ρ2={DG,AC,CDE,AB}替換R,據(jù)chase過程可知,相對(duì)于F,R分解成ρ是無損分解。⑤用ρ3={CDE,AC,DG,BCD}替換R,則F在模式CDE上的投影為{CD→E},F(xiàn)在模式AC上的投影為{C→A},F(xiàn)在模式DG上的投影為{D→G},F(xiàn)在模式BCD上的投影為{C→B}, 顯然從這四個(gè)投影集中的FD推不出原來F中的A→B,因此分解ρ3不保持FD集。4.18設(shè)關(guān)系模式R(ABCD),F(xiàn)是R上成立的FD集,F(xiàn)={A→B,B→C,A→D,D→C},ρ={AB,AC,BD}是R的一個(gè)分解。相對(duì)于F,ρ是無損分解嗎?為什么?試求F在ρ的每個(gè)模式上的投影。ρ保持F嗎?為什么?答:①用測(cè)試過程可以知道,ρ相對(duì)于F是損失分解。②πAB(F)={A→B},πAC(F)={A→C},πBD(F)=φ。③顯然,分解ρ不保持FD集F,丟失了B→C、A→D和D→C等三個(gè)FD。4.19設(shè)關(guān)系模式R(ABCD),R上的FD集F={A→C,D→C,BD→A},試說明ρ={AB,ACD,BCD}相對(duì)于F是損失分解的理由。答:據(jù)已知的F集,不可能把初始表格修改為有一個(gè)全a行的表格,因此ρ相對(duì)于F是損失分解。4.20設(shè)關(guān)系模式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(xiàn)在模式BD
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小區(qū)變廢為寶活動(dòng)方案
- 家園溝通活動(dòng)方案
- 家族文化慶典活動(dòng)方案
- 安心健康活動(dòng)方案
- 小商品大學(xué)問活動(dòng)方案
- 尋找漢服大使活動(dòng)方案
- 小學(xué)作文賣書活動(dòng)方案
- 室內(nèi)團(tuán)建破冰活動(dòng)方案
- 安排部署活動(dòng)方案
- 室內(nèi)搞笑活動(dòng)方案
- 人教版三年級(jí)語文上冊(cè)期末試卷及答案【完整】
- ptfe膜雨棚施工方案
- 人工智能倫理規(guī)則
- 米亞羅-孟屯河谷風(fēng)景名勝區(qū)旅游基礎(chǔ)設(shè)施建設(shè)項(xiàng)目環(huán)評(píng)報(bào)告
- 婦產(chǎn)科護(hù)理學(xué)教材(課后思考題參考答案)
- 二年級(jí)數(shù)學(xué)無紙化監(jiān)測(cè)試題
- 沖突管理與溝通技巧
- 全同態(tài)加密算法概述
- 電流、電壓指針儀表校驗(yàn)報(bào)告
- 六年級(jí)下冊(cè)英語素材-Unit-6-General-revision-3-知識(shí)點(diǎn)-人教精通版
- BS2000標(biāo)準(zhǔn)操作規(guī)程
評(píng)論
0/150
提交評(píng)論