计算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’)
ANDAGEFROMS
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=SC