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

2021-10-05 01:11:16 字數 1383 閱讀 1071

1.

select

2. sname

3.from s

5.where

notexists(6.

select

*from course where

notexists(7.

select

*from sc where sno = student.sno and cno = course.cno )

);

where後面的 not exists()表示條件判斷,當括號內沒有符合條件的元組時,返回true,否則返回false.

然後我們根據題意進行邏輯轉換:

學生 選擇 全部課程 = 學生 不存在 沒有選的課

select sname  from s where

notexists

(沒有選的課 )

沒有選的課=課 不存在 已經被選

select

*from course where

notexists

( 已經被選 )

已經被選的課

select

*from sc where sno = student.sno and cno = course.cno

這就是大體的思路,但是我們要想一下為什麼要這樣做?

首先我想先說明一下exists()和 not exists() 。我們知道 where 後面的式子表示條件判斷,當返回的值為 true 時,才進行前面的選擇,當返回的值為 false 時,則不進行選擇。

exiest()表示當括號裡存在元組時,返回true。(有一項存在即可)

not exists()表示當括號裡不存子元組時,返回true。(必須是全部,沒有一項存在)

我們現在開始從頭往後捋,我們要選擇學生姓名,期待後面的條件是true,而我們的條件是選修全部課程,所以用 not exists()比較合適。然後我們再次選擇沒有被選的課,期待後面的條件是true,我們很容易想到用exists()來找到其中乙個學生與課程不對應的就行,但是我們sc表中儲存的是學生對應的選課關係,沒有被選的課需要用到否定來轉換,既可以用not exists()來表示。

我們可能又有疑問了,不是要根據全部或其中之一這個條件來選擇嗎?

我們應當注意,在第乙個選擇時是一對多,而在第二次選擇時,已經代入了上一層的學生,進行的是一對一的選擇,此時not exists()和exists()表示一樣。

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

select sname from student where not exists select from course where not exists select from sc where sno student.sno and cno course.cno 我的理解是 這是乙個相關子查詢...

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 e...

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

查詢選修le全部課程的學生姓名 select sname from student where not exists select from course where not exists select from sc where sno student.sno and cno course.cno...