SQL查詢選修了全部課程的學生姓名
阿新 • • 發佈:2018-12-06
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這個人。自己跑一遍也就知道了。