帶有EXISTS謂詞的子查詢不返回任何數據,只產生邏輯真值“true”或邏輯假值“false”.
1、查詢所有選修了1號課程的學生姓名。
本查詢涉及Student和SC表。可以在Student中一次取每個元組的Sno值,用此值去檢查SC表。若SC中存在這樣的元組,其Sno值等於此Student.Sno值,並且其Cno='1',則取此Student.Sname送入結果表。
SELECT Sname FROM Student WHERE EXISTS(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno='1')
使用存在量詞EXISTS後,若內層查詢結果非空,則外層的WHERE子句返回真值,否則返回假值。
由EXISTS引出的子查詢,其目標列表達式通常都用*,因爲帶EXISTS的子查詢只返回真值或假值,給出列名無實際意義。
本例中子查詢的查詢條件依賴於外層父查詢的某個屬性值(Student的Sno值),因此也是相關子查詢。
這個相關子查詢的處理過程是:首先取外層查詢中(Student)表的第一個元組,根據他與內層查詢相關的屬性值(Sno值)處理內層查詢。若WHERE子句返回值爲真,則取外層查詢中該元組的Sname放入結果表;然後再取(Student)表的下一個元組,重複這一過程,直至外層(Student)表全部檢查完爲止。