文档详情

【数据库应用黄皮本第3章 关系数据库语言SQL.doc

发布:2015-12-23约8.11千字共9页下载文档
文本预览下载声明
第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
显示全部
相似文档