EXIST子查询

Posted Do Better

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EXIST子查询相关的知识,希望对你有一定的参考价值。

已知关系模式: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子查询的主要内容,如果未能解决你的问题,请参考以下文章

EXIST子查询

sql中in和exist语句的区别?

oracle exist 语句

in exist,not in ,not exist

detectron2报AttributeError: Attribute ‘evaluator_type‘ does not exist in the metadata of dataset(代码片段

In 和Exists