数据库习题作业.docx
- 文档编号:12737622
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:20
- 大小:47.29KB
数据库习题作业.docx
《数据库习题作业.docx》由会员分享,可在线阅读,更多相关《数据库习题作业.docx(20页珍藏版)》请在冰豆网上搜索。
数据库习题作业
数据库习题作业重点(第2-3-4章)
2.6设有关系R和S:
RABCSABC
367345
257723
723
443
计算R∪S,R-S,R∩S,R×S,π3,2(S),σB<’5’(R),R2<2S,RS。
解:
R∪SABCR-SABCR∩SABC
367367723
257257
723443
443
345
R×SR.AR.BR.CS.AS.BS.Cπ3,2(S)CB
36734554
36772332
257345
257723
723345
723723
443345
443723
σB<’5’(R)ABCR⋈SR.AR.BR.CS.AS.BS.C
723723345
443
R⋈SABC
723
2.7设有关系R和S:
RABSBC
abbc
cbea
debd
B 计算R⋈S,R⋈S,σA=C(R×S),S⋉R。 2.8假设关系U和V分别有m个元组和n个元组,给出下列表达式中可能的最小和最大的元组数量: ⑴U∩V⑵U∪V ⑶U⋈V⑷σF(U)×V(F为某个条件) ⑸πL(U)-V(其中L为某属性集) 解: 操作 最小元组数 最大元组数 ⑴U∩V 0 min(m,n) ⑵U∪V max(m,n) m+n ⑶U⋈V 0 m×n ⑷σF(U)×V 0 m×n ⑸πL(U)-V 0 m 2.17设有三个关系: T(T#,TNMAE,TITLE) C(C#,CNAME,T#) S(S#,SNAME,AGE,SEX) SC(S#,C#,SCORE) 试用关系代数表达式表示下列查询语句: ①检索年龄小于17岁的女学生的学号和姓名。 ②检索男学生所学课程的课程号和课程名。 ③检索男学生所学课程的任课教师的工号和姓名。 ④检索至少选修两门课的学生学号。 ⑤检索至少有学号为S2和S4学生选修的课程的课程号。 ⑥检索WANG同学不学的课程的课程号。 ⑦检索全部学生都选修的课程的课程号与课程名。 ⑧检索选修课程包含LIU老师所授全部课程的学生学号。 解: ⑴πS#,SNAME(σAGE<’17’∧SEX=’F’(S)) ⑵Πc#,CNAME(σSEX='M'(S⋈SC⋈C)) ⑶ΠT#,TNAME(σSEX='M'(S⋈SC⋈C⋈T)) ⑷π1(σ1=4∧2≠5(SC×SC)) ⑸π2(σ1=’S2’∧4=’S4’∧2=5(SC×SC)) ⑹πC#(C)-πC#(σSNAME='WANG'(S⋈SC)) ⑺πC#,CNAME(C⋈(πS#,C#(SC)÷πS#(S))) ⑻πS#,C#(SC)÷πC#(σTNAME='LIU'(C⋈T)) 2.21在教学数据库的关系S、SC、C、T中,用户有一查询语句: 检索女同学选修课程的课程名和任课教师名。 ①试写出该查询的关系代数表达式。 ②画出查询表达式的语法树。 ③使用启发式优化算法,对语法树进行优化,并画出优化后的语法树。 解: 【3.2】设教学数据库中有4个关系: 教师关系T(T#,TNAME,TITLE) 课程关系C(C#,CNAME,T#) 学生关系S(S#,SNAME,AGE,SEX) 选课关系SC(S#,C#,SCORE) 试用SQL查询语句表示下列查询。 解: ①检索年龄小于17岁的女学生的学号和姓名。 SELECTS#.SNAME FROMS WHEREAGE<17ANDSEX=’F’ ②检索男学生所学课程的课程号和课程名。 SELECTC.C#,CNAME(连接查询方式) FROMS,SC,C WHERES.S#=SC.S#ANDSC.C#=C.C#ANDSEX=’M’; ③检索男学生所学课程的任课老师的工号和姓名。 SELECTT.T#,TNAME FROMS,SC,C,T WHERES.S#=SC.S#ANDSC.C#=C.C#ANDC.T#=T.T#ANDSEX=’M’; ④检索至少选修两门课程的学生学号。 SELECTDISTINCTX.S# FROMSCASX,SCASY WHEREX.S#=Y.S#ANDX.C#! =Y.C#; ⑤检索至少有学号为S2和S4的学生选修的课程的课程号。 SELECTDISTINCTX.C# FROMSCASX,SCASY WHEREX.S#=’S2’ANDY.S#=’S4’ANDX.C#=Y.C#; ⑥检索WANG同学不学的课程的课程号。 SELECTC# FROMC WHERENOTEXISTS (SELECT* FROMS,SC WHERES.S#=SC.S#ANDSC.C#=C.C#ANDSNAME=’WANG’); ⑦检索全部学生都选修的课程的课程号与课程名。 SELECTC#,CNAME FROMC WHERENOTEXISTS (SELECT* FROMS WHERENOTEXISTS (SELECT* FROMSC WHERES#=S.S#ANDC#=C.C#)); ⑧检索选修课程包含LIU老师所授全部课程的学生学号。 法一: SELECTDISTINCTS# FROMSCASX WHERENOTEXISTS (SELECT* FROMC,T WHEREC.T#=T.T#ANDTNAME=’LIU’ ANDNOTEXISTS (SELECT{ FROMSCASY WHEREY.S#=X.S#ANDY.C#=C.C#)); 法二: SELECTDISTINCTS# FROMSCX WHERENOTEXISTS ((SELECTC#FROMC,T WHEREC.T#=T.T#ANDTNAME='LIU’) EXCEPT (SELECTC#FROMSCYWHEREY.S#=X.S#)); 【3.7】试用SQL查询语句表达下列对第3.2题中4个基本表T、C、S、SC的查询。 ①统计有学生选修的课程门数。 SELECTCOUNT(DISTINCTC#)FROMSC; ②求选修C4课程的女学生的平均年龄。 SELECTAVG(AGE) FROMS,SC WHERES.S#=SC.S#ANDC#=’C4’ANDSEX=’F’: ③求LIU老师所授的每门课程的平均成绩。 SELECTC.C#.AVG(SCORE) FROMSC,C,T WHERESC.C#=C.C#ANDC.T#=T.T#ANDTNAME=’LIU’ GROUPBYC.C#; ④统计选修每门课程的学生人数(超过l0人的课程才统计)。 要求显示课程号和人数,查询结果按人数降序排列,若人数相同,则按课程号升序排列。 SELECTC#.COUNT(S#) FROMSC GROUPBYC# HAVINGCOUNT(*)>10 ORDERBY2DESC,1; ⑤检索学号比WANG同学大,而年龄比他小的学生姓名。 SELECTSNAME FROMS WHERES#>ALL(SELECTS#FROMS WHERESNAME=’WANG’) ANDAGE FROMS WHERESNAME=’WANG); ⑥在表SC中检索成绩为空值的学生的学号和课程号。 SELECTS#,C# FROMSC WHERESCOREISNULL; ⑦检索姓名以L开头的所有学生的姓名和年龄。 SELECTSNAME,AGE FROMS WHERESNAMELIKE’L%’; ⑧求年龄大于女同学平均年龄的男学生的姓名和年龄。 SELECTSNAME,AGE FROMS WHERESEX=’M’ ANDAGE>(SELECTAVG(AGE) FROMS WHERESEX=’F’); ⑨求年龄大于所有女同学年龄的男学生的姓名和年龄。 SELECTSNAME,AGE FROMS WHERESEX=‘M’ ANDAGE>ALL(SELECTAGE FROMS WHERESEX=’F’); 【3.12】 解: ①INSERTINTOC VALUES(‘C8’,’VC++’,’T6’); ② 法一: INSERTINTOFACULTY(TNAME) SELECTDISTINCTTNAME FROM(SELECTTNAME,C.C#,AVG(SCORE) FROMT,C,SC WHERET.T#=C.T#ANDC.C#=SC.C# GROUPBYTNAME,C.C#) ASRESULT(TNAME,C#,AVG—SCORE)ASX WHERE80<=ALL(SELECTAVG—SCORE FROMRESULTASY WHEREY.TNAME=X.TNAME); 法二 INSERTINTOFACULTY(TNAME) SELECTDISTINCTTNAME FROMT,C,SC WHEREC.C#=SC.C#ANDT.T#=C.T# ANDT#NOTIN(SELECTT#FROMC WHEREC#IN (SELECTC#FROMSC GROUPBYC#HAVINGAVG(SCORE)<=80) ) ③DELETEFROMSCWHERESCOREISNULL; ④DELETEFROMSC WHERES#IN(SELECTS#FROMSWHERESEX=’F’) ANDC#IN(SELECTC#FROMC,TWHEREC.T#=T.T#ANDTNAME=’LIU’); ⑤UPDATESC SETSCORE=60 WHERESCORE<60 ANDC#IN(SELECTC#FROMCWHERECNAME=’MATHS’); ⑥UPDATESC SETSCORE=SCORE*1.05 WHERES#IN(SELECTS#FROMSWHERESEX='F’) ANDSCORE<(SELECTAVG(SCORE)FROMSC); ⑦用两个UPDATE语句实现: UPDATESC SETSCORE=SCORE*1.04 WHEREC#=’C4’ANDSCORE>70; UPDATESC SETSCORE=SCORE*1.05 WHEREC#=’C4’ANDSCORE<=70; 这两个UPDATE语句的顺序不能颠倒。 用一个UPDATE语句实现: UPDATESC SETSCORE=SCORE*CASE WHENSCORE>70THEN1.04 ELSEl.05 END WHEREC#=’C4’; ⑧UPDATESC SETSCORE=SCORE*1.05 WHERESCORE<(SELECTAVG(SCORE) FROMSC); 【3.13】设数据库中有3个关系: 职工表EMP(E#,ENAME,AGE,SEX,ECITY),其属性分别表示职工工号、姓名、年龄、性别和籍贯。 工作表WORKS(E#,C#,SALARY),其属性分别表示职工工号、工作的公司编号和工资。 公司表COMP(C#,CNAME,CITY),其属性分别表示公司编号、公司名称和公司所在城市。 试用SQL语句写出下列操作: ①用CREATETABLE语句创建上述3个表,需指出主键和外键。 ②检索超过50岁的男职工的工号和姓名。 ③假设每个职工只能在一个公司工作,检索工资超过1000元的男性职工工号和姓名。 ④假设每个职工可在多个公司工作,检索至少在编号为C4和C8的公司兼职的职工工号 和姓名。 ⑤检索在联华公司工作、工资超过1000元的男性职工的工号和姓名。 ⑥假设每个职工可在多个公司工作,检索每个职工的兼职公司数目和工资总数,显示 (E#,NUM,SUM_SALARY),分别表示工号、公司数目和工资总数。 ⑦工号为E6的职工在多个公司工作,试检索至少在E6职工兼职的所有公司工作的职工 工号。 ⑧检索联华公司中低于本公司平均工资的职工工号和姓名。 ⑨在每一公司中为50岁以上的职工加薪100元(若职工为多个公司工作,可重复加)。 ⑩在EMP表和WORKS表中删除年龄大于60岁的职工有关元组。 解: ①CREATETABLEEMP (E#CHAR(4)NOTNULL, ENAMECHAR(8)NOTNULL, AGESMALLINT, SEXCHAR (1), ECITYCHAR(20), PRIMARYKEY(E#)); CREATETABLECOMP (C#CHAR(4)NOTNULL, CNAMECHAR(20)NOTNULL, CITYCHAR(20), PRIMARYKEY(C#)); CREATETABLEWORKS (E#CHAR(4)NOTNULL, C#CHAR(4)NOTNULL, SALARYSMALLINT, PRIMARYKEY(E#,C#), FOREIGNKEY(E#)REFERENCESEMP(E#), FOREIGNKEY(C#)REFERENCESCOMP(C#)); ②(SELECTE#,ENAME FROMEMP WHEREAGE>50ANDSEX=’M’; ③SELECTEMP.E#,ENAME FROMEMP,WORKS WHEREEMP.E#=WORKS.E#ANDSALARY>1000ANDSEX=’M’; ④SELECTA.E#,A.ENAME FROMEMPA,WORKSB,WORKSC WHEREA.E#=B.E#ANDB.E#=C.E# ANDB.C#=’C4’ANDC.C#=’C8’; ⑤SELECTA.E#,A.ENAME FROMEMPA,WORKSB,COMPC WHEREA.E#=B.E#ANDB.C#=C.# ANDCNAME=’联华公司’ANDSALARY>1000ANDSEX='M’; ⑥SELECTE#,COUNT(C#)ASNUM,SUM(SALARY)ASSUM_SALARY FROMWORKS GROUPBYE#; ⑦SELECTX.E# FROMWORKSX WHERENOTEXISTS (SELECT* FROMWORKSY WHEREE#=’E6’ ANDNOTEXISTS (SELECT* FROMWORKSZ WHEREZ.E#=X.E#ANDZ.C#=Y.C#)); ⑧SELECTA.E#,A.ENAME FROMEMPA,WORKSB,COMPC WHEREA.E#=B.E#ANDB.C#=C.C#ANDCNAME=’联华公司’ ANDSALARY<(SELECTAVG(SALARY) FROMWORKS.COMPC WHEREWORKS.C#=COMP.C#ANDCNAME=’联华公司’); ⑨UPDATEWORKS SETSALARY=SALARY+100 WHEREE#IN(SELECTE#FROMEMPWHEREAGE>50); ⑩DELETEFROMWORKS WHEREE#IN(SELECTE#FROMEMPWHEREAGE>60); DELETEFROMEMP WHEREAGE>60; 4.8设关系模式R(ABCD),F是R上成立的FD集,F={A→B,C→B},则相对于F,试写出关系模式R的关键码。 并说明理由。 解: R的关键码为ACD。 因为从已知的F,只能推出ACD→ABCD。 4.9设关系模式R(ABCDE)上FD集为F,并且F={AB→C,CD→E,DE→B},试判断AB是R的候选键吗? ABD呢? 请做出解释。 解: ①从已知的F,可推出AB→ABC,但不能推出AB→ABCDE,因此不是。 ②从已知的F,可推出ABD→ABCD,ABD→ABCDE,因此是的。 4.13设关系模式R(ABCD),F是R上成立的FD集,F={A→B,B→C}, 1试写出属性集BD的闭包(BD)+。 2试写出所有左部是B的函数依赖(即形为“B→? ”)。 解: ①从已知的F,可推出BD→BCD,所以(BD)+=BCD。 ②由于B+=BC,因此左部是B的FD有四个: B→φ,B→B,B→C,B→BC。 4.14设关系模式R(ABCDE)上FD集为F,并且F={A→BC,CD→E,B→D,E→A}。 ①试求R的候选键。 ②试求B+的值。 解: ①R的候选键有四个: A、E、CD和BC。 ②B+=BD。 4.26设关系模式R(ABCD),F是R上成立的FD集,F={AB→CD,A→D}。 1试说明R不是2NF模式的理由。 2试把R分解成2NF模式集。 答: ①从已知FD集F,可知R的候选键是AB。 另外,AB→D是一个局部依赖,因此R不是2NF模式。 ②此时R应分解成ρ={AD,ABC},ρ是2NF模式集。 4.27设关系模式R(ABC),F是R上成立的FD集,F={C→B,B→A}。 1试说明R不是3NF模式的理由。 2试把R分解成3NF模式集。 答: ①从已知FD集F,可知R的候选键是C。 从C→B和B→A,可知C→A是一个传递依赖,因此R不是3NF模式。 ②此时R应分解成ρ={CB,BA},ρ是3NF模式集。 第1章: ☐作业: P37 ☐1.3,1.4,1.5,1.6,1.12,1.17,1.27 第5章 ☐作业: ☐5.2,5.5,5.6,5.8,5.13,5.14,5.15 第7章 ⏹作业: ⏹7.2,7.3,7.4,7.8,7.16,7.17 复习范围 1.2.2、1.2.3、1.3-1.6、1.7 2.1、2.2、2.4、2.6 3.2、3.3、3.5、3.8 4.2、4.4、4.6 5.1、5.2、5.3、5.4 7.1、7.2、7.3、7.5、7.6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 习题 作业