【数据库应用黄皮本第3章 关系数据库语言SQL.doc
文本预览下载声明
第3章 关系数据库语言SQL
教材中习题3的解答
3.2 解:① SELECT S#, SNAME
FROM S
WHERE AGE17 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 C#, CNAME(嵌套查询方式)
FROM C
WHERE C# IN (SELECT C#
FROM SC
WHERE S# IN (SELECT S#
FROM S
WHERE SEX=’M’));
或:SELECT C#, CNAME(存在量词方式)
FROM C
WHERE EXISTS (SELECT *
FROM SC
WHERE C.C#=SC.C#
AND EXISTS (SELECT *
FROM S
WHERE SC.S#=S.S#
AND SEX=’M’));
EXISTS 表示存在量词, EXISTS操作符后子查询的结果集中如果不为空,则产生逻辑真值“true”,否则产生假值“false”
这类查询和不相关子查询有一个明显区别,即子查询的查询条件依赖于外层父查询的某个属性值,内层查询由于与外层查询有关,因此必须反复求值
一般处理过程为:首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表,然后再取外层表的下一个元组,重复这一过程,直到外层表全部查完为止。
③ SELECT T.T#,TNAME
FROM T,SC, C,S
WHERE T.T#=C.C# AND SC.C#=C.C# AND SC. S#= S.S# 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 C#
FROM SC AS X, SC AS Y
WHERE X.C#=Y.C# AND X.S#=’S2’ AND Y.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#));
外层循环依次扫描C关系中的每个元组,中层循环依次扫描S关系中的每个元组,内层循环依次扫描SC关系中的每个元组,对于C关系中的每个元组,若有一个学生没有选修,则最内层查询为空,得出中层选择条件为真,进而得出中层查询不为空,从而外层的选择条件为假,该课程不会选出来放到结果集中。所以,只有某个课程被学生中的所有学生选修,最内层查询每次都不为空,中层选择条件每次都为假,得出中层查询结果为空,进而得出外层选择条件为真,该课程元组被选择出来放到结果集中。
⑧ SELECT DISTINCT S#
FROM SC AS X
WHERE NOT EXISTS
(SELECT *
FROM C, T
WHERE C.T#=T.T# AND TNAME=’LIU’
AND NOT EXISTS
(SELECT *
FROM SC AS Y
WHERE Y.S#=X.S# AND Y.C#=C.C#));
或者SELECT DISTINCT S#
FROM SC AS X
WHERE NOT EXIS
显示全部