日期:2014-05-17 浏览次数:20714 次
SELECT Sno FROM SC X,SC Y WHERE X.Sno=Y.Sno AND X.Cno='C2'AND Y.Cno='C4'
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))
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选修了