SQL中EXISTS/NOT EXISTS的用法

student/course

  

 

SCORE/TEACHER

 


例1:查询所有选修了3-245号课程的学生姓名

有以下四种写法:

1.exists写法

首先取Student表中的一个元组,然后在SCORE表中依次找SCORE.Sno=该元组的Sno,并且对应的Cno='3-245',如果存在,则外层查询的where子句返回为真,则Student表中的该元组可以输出。然后依次遍历Student表中的其他元组。

select SNAME FROM STUDENT 
where EXISTS(select * from SCORE where STUDENT.SNO = SCORE.SNO and SCORE.CNO = '3-245')

2. join on写法

select SNAME from STUDENT 
JOIN SCORE on STUDENT.SNO = SCORE.SNO and SCORE.cno = '3-245'

3.in写法

SELECT SNAME from STUDENT
WHERE sno in (select sno from SCORE WHERE SNO = STUDENT.SNO and CNO = '3-245')

 4.引用两个表

SELECT SNAME from STUDENT,SCORE
WHERE STUDENT.SNO = SCORE.SNO and SCORE.CNO = '3-245'

 

结果都是:


例2:查询没有选修3-245号课程的学生姓名

select SNAME FROM STUDENT 
where NOT EXISTS(select * from SCORE where STUDENT.SNO = SCORE.SNO and SCORE.CNO = '3-245')

 例3:查询选修了全部课程的学生姓名

查找语义:查询这样的学生,没有一门课程是他不选修的。

查找过程:

首先,选取Student表中的一个元组,然后在依次判断Course表中的每个元组是否可以输出,只要有一个课程可以输出,则最外层查询的where子句返回为false;而在判断某个课程是否可以输出时,则要利用第三层查询,利用当前的学号和当前的课程号,在SC表中查询,如果存在,则第二层查询where子句返回false。至此,每一门课程都不可以输出时,这个学号对应的元组才可以输出。表示这个学生选修了全部的课程。

select Sname
from STUDENT
where not exists
          (
                 select *
                 from COURSE
                 where not exists
                           (
                                 select *
                                 from  SCORE
                                 where SNO=STUDENT.SNO AND
                                            CNO=COURSE.CNO
                           ) )

 

posted @ 2016-08-03 09:57  hjhsysu  阅读(4262)  评论(0编辑  收藏  举报