數據庫操作: 查詢選修了所有課程的學生

先給出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 了,就會輸出




小弟才疏學淺 == 錯誤之處煩請各位巨巨指正 == 


發佈了30 篇原創文章 · 獲贊 9 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章