日期:2014-05-17  浏览次数:20714 次

求大神帮看下这个sql语句的具体意思
设教学数据库Education有三个表:
学生表S(SNO,SNAME,AGE,SEX,SDEPT);
学习表SC(SNO,CNO,GRADE);
课程表C(CNO,CNAME,CDEPT,TNAME)

问:(1)检索至少选修课程号为C2和C4的学生学号;
    (2)检索学习全部课程的学生姓名;
    (3)查询所学课程包含学生S3所学课程的学生学号。

以下是答案:
(1):
SELECT Sno FROM SC X,SC Y WHERE X.Sno=Y.Sno AND X.Cno='C2'AND Y.Cno='C4'


(2):
SELECT Sname FROM S WHERE NOT EXISTS (SELECT * FROM C WHERE NOT EXISTS (SELECT *FROM SC WHERE SC.Sno=S.Sno AND SC.Cno=C.CnO))


(3):
SELECT DISTINCT Sno FROM SC AS X WHERE NOT EXISTS (SELECT * FROM SC AS Y WHERE Y.Sno='S3'AND NOT EXISTS (SELECT * FROM SC AS Z WHERE Z.Sno=X.Sno AND Z.Cno=Y.Cno))


  我就是不明白他这几个答案的具体意思,怎么执行的,求大神解释啊 

------解决方案--------------------
Use tempdb;
Create table s(sno varchar(50),sname varchar(50),age varchar(50));
create table sc(sno varchar(50),cno varchar(50),grade int);
create table c (cno varchar(50),cname varchar(50));
Insert Into s(sno,sname,age)
 Select '1','张三',10 Union all
 select '2','郑一',10 Union all
 select '3','王五',10 Union all
 select '4','李四',10 Union all
 select 's3','张六',10

Insert Into c(cno,cname)
 select 'c1','数据结构' Union all
 select 'c2','操作系统' union all
 select 'c3','组成原理' 

Insert Into sc(sno,cno)
 select '1','c1' union all
 select '1','c2' Union all
     select '1','c3' Union all
     select 's3','c1'

----查询至少选修了 c1,c2的学生,sc中的一条记录如 '1' ,'c1'表示1号学生选修了c1课程,如果c1还选修了c2
--则还存在'1','c2'这么一条记录,此时,ci同时选修了c1,c2,通过用sc表的sno,做自关联便可查出要求的记录。
SELECT y.Sno FROM SC X,SC Y WHERE X.Sno=Y.Sno AND X.Cno='C1'AND Y.Cno='C2' 
---(2)检索学习全部课程的学生姓名;
-----用逆向思维。查询没有一门课程没有选修的学生
--查询 一个学生
--对于这个学生 不存在一门课程 (第一个Not Exists)
--对于这门课
--这个学生 没有选修 (对应第二个Not Exists)
SELECT Sname 
FROM S WHERE 
 NOT EXISTS --不存在一门课
(SELECT * FROM C WHERE
NOT EXISTS --这个学生没有选修,
(SELECT *FROM SC WHERE SC.Sno=S.Sno AND SC.Cno=C.Cno))

--查询所学课程包含学生S3所学课程的学生学号。
--同上,逆向思维
--查询 一个学生
--对于这个学生 不存在一门课程
--对于这门课程 s3选修过
--这个学生 没有选修
SELECT DISTINCT Sno 
FROM SC AS X 
WHERE NOT EXISTS --不存在一门课程
(SELECT * FROM SC AS Y WHERE Y.Sno='S3'--这门课程s3选修了
AND NOT EXISTS --s3选修了