第二章
2.6 设有关系R和S:
R A B C S A B C
3 6 7 3 4 5 2 5 7 7 2 3 7 2 3 4 4 3
计算R∪S,R-S,R∩S,R×S,π3,2(S),σB<’5’(R),R 2<2 S, R S。 解: R∪S A B C R-S A B C R∩S 3 6 7 3 6 7 2 5 7 2 5 7 7 2 3 4 4 3 4 4 3 3 4 5
R×S R.A R.B R.C S.A S.B S.C π3,2(S) 3 6 7 3 4 5 3 6 7 7 2 3 2 5 7 3 4 5 2 5 7 7 2 3 7 2 3 3 4 5 7 2 3 7 2 3 4 4 3 3 4 5 4 4 3 7 2 3
σB<’5’(R) A B C R?S R.A R.B R.C S.A S.B S.C 7 2 3 7 2 3 3 4 4 3 R?S A B C 7 2 3
2.7 设有关系R和S:
R A B S B C a b b c c b e a d e b d 计算R ? S,R ? S,σA=C(R×S),S ? R。
解: R?S A B C R?S R.A R.B S.B C a b c a b b c a b d a b b d c b c c b b c c b d c b b d d e a S ? R B C b c b d
A B C 7 2 3 B 5 4 3 2 4 5 C 2.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老师所授全部课程的学生学号。
解:① SELECT S#, SNAME FROM S
WHERE AGE<23 AND SEX=’F’; ② SELECT C.C#,CNAME FROM S,SC,C
WHERE S.S#=SC.S# AND SC.C#=C.C# AND SEX=’M’; ③ SELECT T#,TEACHER FROM S,SC, C,T
WHERE 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 Y
WHERE X.S#=Y.S# AND X.C#!=Y.C# ⑤ SELECT DISTINCT X.C# FROM SC AS X, SC AS Y
WHERE X.S#=S2 AND Y.S#=S4 AND X.C#=Y.C#; 嵌套写法:SELECT C# FROM SC
WHERE S#=S2 AND C# IN
(SELECT C# FROM SC
WHERE SC.S#=S4); ⑥ SELECT C# FROM C
WHERE NOT EXISTS (SELECT * FROM S, SC
WHERE S.S#=SC.S# AND SC.C#=C.C# AND SNAME=’WANG’); ⑦ SELECT C#, CNAME FROM C
WHERE NOT EXISTS (SELECT * FROM S
WHERE NOT EXISTS (SELECT * FROM SC
WHERE S#=S.S# AND C#=C.C#)); ⑧ SELECT DISTINCT S# FROM SC AS X WHERE NOT EXISTS (SELECT * FROM C
WHERE TNAME=’LIU’ AND NOT EXISTS (SELECT *
FROM SC AS Y
WHERE Y.S#=X.S# AND Y.C#=C.C#));
3.7 试用SQL查询语句表达下列对3.2题中4个基本表S、SC、C、T的查询: ① 统计有学生选修的课程门数。
② 求选修C4课程的女学生的平均年龄。
③ 求LIU老师所授课程的每门课程的平均成绩。
④ 统计每门课程的学生选修人数(超过10人的学生才统计)。要求显示课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。 ⑤ 检索学号比WANG同学大,而年龄比他小的学生姓名。 ⑥ 在表SC中检索成绩为空值的学生学号和课程号。 ⑦ 检索姓名以L打头的所有学生的姓名和年龄。
⑧ 求年龄大于女同学平均年龄的男学生姓名和年龄。 ⑨ 求年龄大于所有女同学年龄的男学生姓名和年龄。 解:① SELECT COUNT(DISTINCT C#) FROM SC; ② SELECT AVG(AGE)