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