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
                           ) )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM