先給出sql 代碼:
select sno, sname
from students
where not exists(
select * from course
where not exists(
select *
from sc
where sno = students.sno and cno = course.cno
)
)
是吧,你肯定會想 == 臥槽這是什麼鬼
因爲sql 中沒有全稱量詞,所以要把要求轉換爲 等價的 存在量詞的表述形式
也就是轉化成 雙重否定的形式
not exists 將不滿足的條件的提交,裏面一個not exists 意思就是說,我先把每個學生選修的全部課程都找出來(a),然後再和所有的課程比較(b) ,兩個比較,提交a,然後用b 比較a 如果有 b 裏面有,而a 裏面滅有not exists 的,那我們就把這條數據提交,也就是返回 true 返回真的話,外面的 not exists 一作用就變成 false 了
所以如果學生有課程沒有選的話,那麼就是false 就不會輸出
同理,如果a 中的每條記錄和b 中都是一樣的,那麼就不會有 not exists 的問題了,因爲都exists 啊! 所以是 false 然後外面的 not exists 一作用就變成 true 了,就會輸出
小弟才疏學淺 == 錯誤之處煩請各位巨巨指正 ==