数据库习题作业重点(第2-3-4章)7 2 3443计算R ∪S ,R-S ,R ∩S ,R ×S ,π3,2(S ),σB<’5’(R),R 2<2 解: R ∪S A B C R -S A B C R ∩S A B C 3 6 7 3 6 77232 5 7 2 5 7 7 2 34434 4 3345R ×S R.A R.B R.C S.A S.B S.C π3,2(S ) C B 3 6 7 3 4 5 5 4 3 6 7 7 2 3322 5 7345 2 5 7 7 2 3 7 2 3 3 4 5 7 2 3 7 2 3 4 4 3 3 4 5443723σB<’5’(R) A B C R⋈S R.A R.B R.C S.A S.B S.C7 2 3 7 2 3 3 4 54 4 3R⋈S A B C7 2 32.7 设有关系R和S:R A B S B Ca b b cc b e ad e b d计算R ⋈ S,R ⋈ S,σA=C(R×S),S ⋉ R。
2<2B<Ce ab2.8 假设关系U和V分别有m个元组和n个元组,给出下列表达式中可能的最小和最大的元组数量:⑴U∩V ⑵U∪V⑶U⋈V ⑷σF(U)×V (F为某个条件)⑸πL(U)-V (其中L为某属性集)解:操作最小元组数最大元组数⑴U∩V0min(m,n)⑵U∪V max(m,n)m+n⑶U⋈V0m×n⑷σF(U)×V0m×n⑸πL(U)-V0m2.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岁的女学生的学号和姓名。
SELECT S#.SNAMEFROM SWHERE AGE<17 AND SEX=’F’②检索男学生所学课程的课程号和课程名。
SELECT C.C#,CNAME (连接查询方式)FROM S,SC,CWHERE S.S#=SC.S# AND SC.C#=C.C# AND SEX=’M’;③检索男学生所学课程的任课老师的工号和姓名。
SELECT T.T#, TNAMEFROM S,SC,C,TWHERE S.S#=SC.S# AND SC.C#=C.C# AND C.T#=T.T# AND SEX=’M’;④检索至少选修两门课程的学生学号。
SELECT DISTINCT X.S#FROM SC AS X, SC AS YWHERE X.S#=Y.S# AND X.C#!=Y.C#;⑤检索至少有学号为S2和S4的学生选修的课程的课程号。
SELECT DISTINCT X.C#FROM SC AS X, SC AS YWHERE X.S#=’S2’AND Y.S#=’S4’ AND X.C#=Y.C#;⑥检索WANG同学不学的课程的课程号。
SELECT C#FROM CWHERE NOT EXISTS(SELECT *FROM S, SCWHERE S.S#=SC.S# AND SC.C#=C.C# AND SNAME=’WANG’);⑦检索全部学生都选修的课程的课程号与课程名。
SELECT C#,CNAMEFROM CWHERE NOT EXISTS(SELECT *FROM SWHERE NOT EXISTS(SELECT *FROM SCWHERE S#=S.S# AND C#=C.C#));⑧检索选修课程包含LIU老师所授全部课程的学生学号。
法一:SELECT DISTINCT S#FROM SC AS XWHERE NOT EXISTS(SELECT *FROM C,TWHERE C.T#=T.T# AND TNAME=’LIU’AND NOT EXISTS(SELECT{FROM SC AS YWHERE Y.S#=X.S# AND Y.C#=C.C#));法二:SELECT DISTINCT S#FROM SC XWHERE NOT EXISTS((SELECT C# FROM C,TWHERE C.T#=T.T# AND TNAME='LIU’)EXCEPT(SELECT C# FROM SC Y WHERE Y.S#=X.S#));【3.7】试用SQL查询语句表达下列对第3.2题中4个基本表T、C、S、SC的查询。
①统计有学生选修的课程门数。
SELECT COUNT(DISTINCT C#) FROM SC;②求选修C4课程的女学生的平均年龄。
SELECT AVG(AGE)FROM S,SCWHERE S.S#=SC.S# AND C#=’C4’AND SEX=’F’:③求LIU老师所授的每门课程的平均成绩。
SELECT C.C#.AVG(SCORE)FROM SC,C,TWHERE SC.C#=C.C# AND C.T#=T.T# AND TNAME=’LIU’GROUP BY C.C#;④统计选修每门课程的学生人数(超过l0人的课程才统计)。
要求显示课程号和人数,查询结果按人数降序排列,若人数相同,则按课程号升序排列。
SELECT C#.COUNT(S#)FROM SCGROUP BY C#HAVING COUNT(*)>10ORDER BY 2 DESC,1;⑤检索学号比WANG同学大,而年龄比他小的学生姓名。
SELECT SNAMEFROM SWHERE S#>ALL(SELECT S# FROM SWHERE SNAME=’WANG’)AND AGE<ALL( SELECT AGEFROM SWHERE SNAME=’WANG);⑥在表SC中检索成绩为空值的学生的学号和课程号。
SELECT S#, C#FROM SCWHERE SCORE IS NULL;⑦检索姓名以L开头的所有学生的姓名和年龄。
SELECT SNAME, AGEFROM SWHERE SNAME LIKE ’L%’;⑧求年龄大于女同学平均年龄的男学生的姓名和年龄。
SELECT SNAME, AGEFROM SWHERE SEX=’M’AND AGE>(SELECT AVG(AGE)FROM SWHERE SEX=’F’);⑨求年龄大于所有女同学年龄的男学生的姓名和年龄。
SELECT SNAME, AGEFROM SWHERE SEX=‘M’AND AGE>ALL(SELECT AGEFROM SWHERE SEX=’F’);【3.12】解:①INSERT INTO CVALUES(‘C8’,’VC++’,’T6’);②法一:INSERT INTO FACULTY(TNAME)SELECT DISTINCT TNAMEFROM (SELECT TNAME,C.C#,AVG(SCORE)FROM T, C, SCWHERE T.T#=C.T# AND C.C#=SC.C#GROUP BY TNAME,C.C#)AS RESULT(TNAME,C#,AVG—SCORE) AS X WHERE 80<=ALL(SELECT AVG—SCOREFROM RESULT AS YWHERE Y.TNAME=X.TNAME);法二INSERT INTO FACULTY(TNAME)SELECT DISTINCT TNAMEFROM T, C, SCWHERE C.C#=SC.C# AND T.T#=C.T#AND T# NOT IN (SELECT T# FROM CWHERE C# IN(SELECT C# FROM SCGROUP BY C# HAVING AVG(SCORE)<=80))③DELETE FROM SC WHERE SCORE IS NULL;④DELETE FROM SCW HERE S# IN(SELECT S# FROM S WHERE SEX=’F’)AND C# IN(SELECT C# FROM C, T WHERE C.T#=T.T# AND TNAME=’LIU’);⑤UPDATE SCSET SCORE=60WHERE SCORE<60AND C# IN(SELECT C#FROM C WHERE CNAME=’MATHS’);⑥UPDATE SCSET SCORE=SCORE * 1.05WHERE S # IN(SELECT S# FROM S WHERE SEX='F’)AND SCORE<(SELECT AVG(SCORE) FROM SC);⑦用两个UPDATE语句实现:UPDATE SCSET SCORE=SCORE * 1.04WHERE C#=’C4’AND SCORE>70;UPDATE SCSET SCORE=SCORE * 1.05WHERE C#=’C4’AND SCORE<=70;这两个UPDATE语句的顺序不能颠倒。