1. 程式人生 > >SQL查詢選修了全部課程的學生姓名

SQL查詢選修了全部課程的學生姓名

1.  SELECT
2.     	Sname 
3.    FROM
4.    NOT EXISTS ( 
5.		SELECT * FROM course WHERE NOT EXISTS ( 
6.					SELECT * FROM SC WHERE Sno = student.Sno AND Cno = course.Cno ) );

對於這個題目我解釋一下:

NOT EXISTS: 它表示若查詢結果為空,則最外層的WHERE子句返回真值(true),否則為假值(false);EXISTS正好與它相反;

對於執行過程我舉個例子:

SELECT Sname FROM Student WHERE EXISTS(
    SELECT * FROM SC WHERE Sno=Student.Sno
            AND Cno='1');


它的執行過程是:
    首先取外層查詢中Student表的第一個元祖,根據它與內層查詢查詢相關的屬性值(Sno值)處理內層查詢,
    若WHERE子句的返回值為真,則取外層查詢中該元祖的Sname放入結果表;
    然後去Student表的下一個元祖;重複這一過程,直至外層Student表全部檢查完為止。

所有對於上面兩個NOT EXISTS ,他們的執行過程是這樣的。

    首先我們是要查詢選了全部的課程的學生。那麼跑一遍SQL語句,假設有一個 Sno=2012 的學生的選擇了全部課程和一個Sno=2013 的學生只選擇了全部課程的其中幾門; 假設先以Sno=2012(也就是選了全部課程的那位),那麼先往最內層看也就是第6行,既然選擇了全部課程那麼第6行最後不就是有結果集,既然有結果集那麼第5行的NOT EXISTS不就是為false嘛!,也就是第5行得到的結果嘛。 既然第5行為false那不就是第5行的結果集為空,既然第5行的結果集為空那麼第4行的NOT EXISTS不就是為 true , 那麼最後最外層當前元祖不就加入到最後查詢結果集了。

然後對於Sno=2013這個人。自己跑一遍也就知道了。