第二章2.6设有关系R和S:RABCSABC367345257723723443计算R∪S,R-S,R∩S,R×S,π3,2(S),σB’5’(R),R22S,RS。解:R∪SABCR-SABCR∩SABC367367723257257723443443345R×SR.AR.BR.CS.AS.BS.Cπ3,2(S)CB3673455436772332257345257723723345723723443345443723σB’5’(R)ABCR⋈SR.AR.BR.CS.AS.BS.C723723345443R⋈SABC7232.7设有关系R和S:RABSBCabbccbeadebd计算R⋈S,R⋈S,σA=C(R×S),S⋉R。解:R⋈SABCR⋈SR.AR.BS.BCabcabbcabdabbdcbccbbccbdcbbddeaS⋉RBCbcbd2.17设有4个关系:S(S#,SNAME,AGE,SEX)SC(S#,C#,SCORE)C(C#,CNAME,T#)T(T#,TNAME,TITLE)试用关系代数表达式表示下列查询语句:①检索年龄小于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中,用户有一查询语句:检索女同学选修课程的课程名和任课教师名。①试写出该查询的关系代数表达式。②画出查询表达式的语法树。③使用启发式优化算法,对语法树进行优化,并画出优化后的语法树。解:①关系代数表达式为:πCNAME,TEACHER(σSEX=’F’(S⋈SC⋈C⋈T))上述的关系代数表达式为:πCNAME,TEACHER(σSEX=’F’(πL(σS.S#=SC.S#∧SC.C#=C.C#((S×SC)×C))))此处L为S、SC、C中全部属性(公共属性只取一次)。②上述关系代数表达式的语法树如图2.2所示。图2.2③上述的关系代数表达式为:优化后的语法树如图2.3所示。图2.3第三章3.2对于教学数据库的4个基本表S(S#,SNAME,AGE,SEX)SC(S#,C#,SCORE)C(C#,CNAME,T#)T(T#,TNAME,TITLE)试用SQL的查询语句表达下列查询:试用关系代数表达式表示下列查询语句:①检索年龄小于17岁的女学生的学号和姓名。②检索年男学生所学课程的课程号和课程名。③检索男学生所学课程的任课教师的工号和姓名。④检索至少选修两门课程的学生学号。⑤检索至少有学号为S2和S4学生选修的课程的课程号。⑥检索WANG同学不学的课程的课程号。⑦检索全部学生都选修的课程的课程号与课程名。⑧检索选修课程包含LIU老师所授全部课程的学生学号。解:①SELECTS#,SNAMEFROMSWHEREAGE23ANDSEX=’F’;②SELECTC.C#,CNAMEFROMS,SC,CWHERES.S#=SC.S#ANDSC.C#=C.C#ANDSEX=’M’;③SELECTT#,TEACHERFROMS,SC,C,TWHERES.S#=SC.S#ANDSC.C#=C.C#ANDC.T#=T.T#ANDSEX=’M’;④SELECTDISTINCTX.S#FROMSCASX,SCASYWHEREX.S#=Y.S#ANDX.C#!=Y.C#⑤SELECTDISTINCTX.C#FROMSCASX,SCASYWHEREX.S#=S2ANDY.S#=S4ANDX.C#=Y.C#;嵌套写法:SELECTC#FROMSCWHERES#=S2ANDC#IN(SELECTC#FROMSCWHERESC.S#=S4);⑥SELECTC#FROMCWHERENOTEXISTS(SELECT*FROMS,SCWHERES.S#=SC.S#ANDSC.C#=C.C#ANDSNAME=’WANG’);⑦SELECTC#,CNAMEFROMCWHERENOTEXISTS(SELECT*FROMSWHERENOTEXISTS(SELECT*FROMSCWHERES#=S.S#ANDC#=C.C#));⑧SELECTDISTINCTS#FROMSCASXWHERENOTEXISTS(SELECT*FROMCWHERETNAME=’LIU’ANDNOTEXISTS(SELECT*FROMSCASYWHEREY.S#=X.S#ANDY.C#=C.C#));3.7试用SQL查询语句表达下列对3.2题中4个基本表S、SC、C、T的查询:①统计有学生选修的课程门数。②求选修C4课程的女学生的平均年龄。③求LIU老师所授课程的每门课程的平均成绩。④统计每门课程的学生选修人数(超过10人的学生才统计)。要求显示课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。⑤检索学号比WANG同学大,而年龄比他小的学生姓名。⑥在表SC中检索成绩为空值的学生学号和课程号。⑦检索姓名以L打头的所有学生的姓名和年龄。⑧求年龄大于女同学平均年龄的男学生姓名和年龄。⑨求年龄大于所有女同学年龄的男学生姓名和年龄。解:①SELECTCOUNT(DISTINCTC#)FROMSC;②SELECTAVG(AGE)FROMS,SCWHERES.S#=SC.S#ANDC#=’C4’ANDSEX=’F’;③SELECTC.C#,AVG(GRADE)FROMSC,C,TWHERESC.C#=C.C#ANDSC.T#=T.T#TNAME=‘LIU’GROUPBYC.C#;④SELECTC#,COUNT(S#)FROMSCGROUPBYC#HAVINGCOUNT(*)10ORDERBY2DESC,1;⑤SELECTSNAMEFROMSWHERES#ALL(SELECTS#FROMSWHERESNAME=’WANG’)ANDAGEALL(SELECTS#FROMSWHERESNAME=’WANG’);⑥SELECTS#,C#FROMSCWHEREGRADEISNULL;⑦SELECTSNAME,AGEFROMSWHERESNAMELIKE’L%’;⑧SELECTSNAME,AGEFROMSWHERESEX=’M’ANDAGE(SELECTAVG(AGE)FROMSWHERESEX=’F’);⑨SELECTSNAME,AGEFROMSWHERESEX=’M’ANDAGEALL(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.12试用SQL更新语句表达对3.2题教学数据库中关系S、SC、C、T的更新操作:①往关系C中插一个课程元组('C8','VC++','T6')。②检索所授每门课程平均成绩均大于80分的教师姓名,并把检索到的值送往另一个已存在的表FACULTY(TNAME)。③在SC中删除尚无成绩的选课元组。④把选修LIU老师课程的女同学选课元组全部删去。⑤把MATHS课不及格的成绩全改为60分。⑥把低于所有课程总平均成绩的女同学成绩提高5%。⑦在表SC中修改C4课程的成绩,若成绩小于等于70分时提高5%,若成绩大于70分时提高4%(用两种方法实现,一种方法是用两个UPDATE语句实现,另一种方法是用带CASE操作的一个UPDATE语句实现)。⑧在表SC中,当某个成绩低于全部课程的平均成绩时,提高5%。解:①INSERTINTOCVALUES('C8','VC++','T6');②INSERTINTOFACULTY(TNAME)SELECTDISTINCTTNAMEFROM(SELECTTNAME,C.C#,AVG(GRADE)FROMSC,C,TWHERESC.C#=C.C#ANDC.T#=T.#GROUPBYT#,C.C#)ASRESULT(TNAME,C#,AVG_GRADE)ASXWHERE80=ALL(SELECTAVG_GRADEFROMRESULTASYWHEREY.TEACHER=X.TEACHER);③DELETEFROMSCWHERESCOREISNULL;④DELETEFROMSCWHERES#IN(SELECTS#FROMSWHERESEX='F')ANDC#IN(SELECTC#FROMC,TWHEREC.T#=T.#ANDTNAME='LIU');⑤UPDATESCSETSCORE=60WHERESCORE60ANDC#IN(SELECTC#FROMCWHERECNAME='MATHS');⑥UPDATESCSETSCORE=SCORE*1.05WHERES#IN(SELECTS#FROMSWHERESEX='F')ANDSCORE(SELECTAVG(SCORE)FROMSC);⑦用两个UPDATE语句实现:UPDATESCSETSCORE=SCORE*1.04WHEREC#='C4'ANDSCORE70;UPDATESCSETSCORE=SCORE*1.05WHEREC#='C4'ANDSCORE=70;(这两个UPDATE语句的顺序不能颠倒。)用一个UPDATE语句实现:UPDATESCSETSCORE=SCORE*CASEWHENSCORE70THEN1.04ELSE1.05ENDWHEREC#='C4';⑧UPDATESCSETSCORE=SCORE*1.05WHERESCORE(SELECTAVG(SCORE)FROMSC);3.13设数据库中有三个关系:职工表EMP(E#,ENAME,AGE,SEX,ECITY),其属性分别表示职工工号、姓名、年龄、性别和籍贯。工作表WORKS(E#,C#,SALARY),其属性分别表示职工工号、工作的公司编号和工资。公司表COMP(C#,CNAME,CITY),其属性分别表示公司编号、公司名称和公司所在城市。试用SQL语句写出下列操作:①用CREATETABLE语句创建上述三个表,需指出主键和外键。②检索超过50岁的男职工的工号和姓名。③假设每个职工只能在