码迷,mamicode.com
首页 > 其他好文 > 详细

EXIST子查询

时间:2018-05-25 21:19:42      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:code   each   and   基础   nbsp   exists   select   sts   姓名   

已知关系模式:S(Sno,Sname,Sclass),C(Cno,Cname,Cteacher),SC(Sno,Cno,Scgrade)。其中,S为学生关系:Sno学号, Sname姓名,Sclass班级; C为课程关系:Cno课程号, Cname课程名, Cteacher任课教师;SC为学生选课关系:Scgrade成绩。你能书写出下列SQL语句吗?这些语句的书写是衡量你是否掌握数据库语言的标志。

(1)找出学过“李明”老师讲授课程的所有学生;

(2)找出学全了“李明”老师讲授课程的所有学生;

(3)找出没学过“李明”老师讲授课程的所有学生;

(4)找出没学全“李明”老师讲授课程的所有学生。

解:

(1)“学过”词语的含义表示只要为其中一种情况即可,所以,可以采用IN子查询,刚开始做的时候把它想为了EXIST,但其是它和IN不等价

代码如下:

 SELECT DISTINCT S.Sname FROM S

   WHERE SNO IN(SELECT SNO FROM SC,C
                           SC.Cno=C.Cno AND C.Cteacher=李明);            

(2)“全”代表着所有,根据句意,可以等价为不存在有一门“李明”老师主讲的课程该学生没有学过

SELECT S.Sname FROM S
WHERE NOT EXISTS ---不存在
(SELECT * FROM C         ----李明教授课程          
WHERE C.Cteacher=李明 AND NOT EXISTS 
(SELECT * FROM SC  ---该同学没学过
   WHERE S.Sno=SC.Sno AND SC.Cno=C.Cno));

(3)“没学过”则正好与(1)相反,只要改为NOT IN即可

 SELECT Sname FROM S

   WHERE Sno NOT IN(SELECT Sno FROM SC,C 

                      WHERE C.Cteacher=李明 AND  S.Sno=SC.Sno AND SC.Cno=C.Cno);

(4)“没学全”在(2)的基础上加上了否定,则只要在其前面加上否定即可

SELECT DISTINCT S.Sname FROM S

   WHERE S.Sno NOT IN (SELECT SC.Sno FROM SC

                       WHERE NOT EXISTS (SELECT * FROM C

                                        WHERE C.Cteacher=李明 AND NOT EXISTS (SELECT * FROM SC  

                                                            WHERE S.Sno=SC.Sno AND SC.Cno=C.Cno)))

 

EXIST子查询

标签:code   each   and   基础   nbsp   exists   select   sts   姓名   

原文地址:https://www.cnblogs.com/X-Do-Better/p/9090228.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!