查詢同s1同學所選修相同課程的學生的學號

2021-03-04 07:35:38 字數 5471 閱讀 2973

1樓:匿名使用者

try this:

select sno

from sc where **o in ('c1', 'c2')group by sno

having coung(*) = 2

2樓:匿名使用者

先查出所有選了c1或者c2的學號**o in ('c1', 'c2'),再篩選出其中兩個都選的學號having count(*) = 2。語句如下:

select sno from sc where **o in ('c1', 'c2') group by sno having count(*) = 2;

3樓:追風小醇

當子查詢結果多於乙個的時候不能用=號,但可以用關鍵字代替,用like關鍵字代替『=』,或者「is」關鍵字(這個記不太清楚了 你可以試一試)

4樓:快樂壹飪

書上都有,:-(,又是個不看書的孩子

資料庫sql語句中 查詢選修了全部課程的學生的學號和姓名 理解

5樓:匿名使用者

首先頭腦中有三點概念:

1 。 exists 子查詢找到的

提交not exists 子查詢中 找不到的提交

說明:不要去翻譯為存在和不存在,把腦袋搞暈。

2 。 建立程式迴圈的概念,這是乙個動態的查詢過程。如 for迴圈 。

3 。 exists執行的流程exists首先執行外層查詢,再執行記憶體查詢,與in相反。 流程為首先取出外

層中的第一元組, 再執行內層查詢,將外層表的第一元組代入,若內層查詢為真,即有結果

時。返回外層表中的第一元 組,接著取出第二元組,執行相同的演算法。一直到掃瞄完外層整表 。

for(int i =0; i<>eofout;i++)

然後再來看乙個例子: 三張表 學生表student (sno,sname), 課程表course (**o,**ame) 選課表sc

(sno,**o)

要求查詢出 :選修了全部課程的學生姓名

我的思路:

首先學生的選課資訊存在於sc表中, 要想知道某個學生是否選修了全部課程,至少我們需要知道一共有

幾門課程,這是首要的條件。其次,學生選修了與否,我們又要掃瞄sc全表,統計出選修了所有課程的

學生號,最後在student表中根據學生號打出姓名 。

語句如下: (已測試)

select sname from student

where sno in

(select sno from sc

group by sno //根據sno分組,統計每個學生選修了幾門課程。如果等於course的總數,就是我們要找的sno

having count(*) = (select count(*) from course )) //統計course中共有幾門課程

另一種思路:

引入:將題目換為 查詢學號為 00003 沒有選修的科目

思路:我們可以將已知學號代入,把每乙個科目代入(迴圈),這將形成1*count(*)種組合。

將這組成作為條件,一一與sc表種進行比對,找不到匹配的我們提交 。

select **ame from course where

not exists //找不到的組合,提交course

(select * from sc where course.**o = **o and sno = ''00003'')

//在sc中匹配

換個題目: 查詢沒有 沒有選修科目的學生姓名

思路:學號未知 , 科目未知,說明有兩個未知變數。應該有兩個exists。我們可以掃瞄

student 和 course共有 s * c 中組合,將這些組合與sc的每一項進行匹配,注意s*c組合已經包含所

有可能。如果全部找到 ,就說明已經選修了全部課程。找不到就說明有課程沒選修 。再將沒選修的的

提交給上一exists 迴圈 。若上一exists 不存在的再提交給外迴圈。

最後詳細回答你的問題:資料庫sql語句中 查詢選修了全部課程的學生的學號和姓名

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

select sname

from student

where not exists

(select *

from course

where not exists

(select *

from sc

where sno= student.sno

and **o= course.**o);

理解如下: 查詢選修了全部課程的學生姓名。

不用管怎麼樣,第乙個select 必定是在 student 表裡選 sname 既:

select sname

from student

加上條件即: where

條件是什麼呢? 條件就是---------------------》 查詢選修了全部課程的

因為沒有 (任意乙個)謂詞, 只能用 exists 或者 not exists 來表示。 這點理解吧?

所以要把條件翻譯成 -----------------------》 不存在一門課程這個學生沒有選修

where後面就是 不存在(not exists) (

一門課程這個學生沒有選修

)接下來就是把course表中的課程依次拿出來找出 沒有選修的

怎麼找呢? 因為 not exists 子查詢中 找不到的提交

另外你要明白 ----------------------------not exists 查詢 都是相關查詢----------

所以只要把 在最後乙個select 中

where sno= student.sno

and **o= course.**o);

就是將這個同學通過 sc 表 和 crouse的 課程連線一遍,找到連線不上的,即: 沒有選修的, 這樣就找到了一門課這個學生沒有選修, 存在沒有選修的課,那麼該學生被pass掉了,

一次進行乙個同學的判斷 。

若你學過程式程式設計,可以看下面的內容, 若沒有則可忽略、。----------

上述是理解是資料庫系統內部的實現,可以用for迴圈表示

for(i=1; i

}最後你找記住

1. 第乙個select 就是 你要選的就是 學生

select sname

from student

2. 第二個 select 就是 課程

3. 第三個select 就是 學生和課程發生關係的表 ------------sc選修表

讓他們連線起來

固定的模式 1 你要的結果的表 學生

2 滿足條件的表 課程表

3 產生關係的表 選修表

where 通過選修表把他們連線起來

6樓:匿名使用者

這思路是用了個雙重否定來求解的。因為sql中沒有全稱量詞,於是要把題目轉換成等價的存在量詞表達形式。即根據(∀x)p≡¬∃(¬p)來轉化為雙重否定的表達。

同時由於「學生x選修課程y 」

之間是不定的,需要使用兩個exist。

於是「選修了全部課程的學生」等價於「不存在(有他沒選的課的)學生」

使用了兩次not exists來實現雙重否定。

先查詢在課程裡查詢「沒有學生選的課程」,第一次否定,

然後再在學生裡查詢「沒有屬於上面情況的學生」的名字,第二次否定;

結合起來,就是 「沒有(沒選的課程)的學生」了。

好了,從裡到外寫出來,就是

select sname from student where not exists(

select * from course where not exists(

select * from sc where sno=student.sno and **o=course.**o

))這個只不過是逆向思維來解決問題的方法。舉一反三,比如要查「被全部學生都選的課程名」

則是求「不存在有學生沒選它的課程」

select **ame from course where not exists(

select * from student where not exists(

select * from sc where sno=student.sno and **o=course.**o

))再如,查「所有人都沒選修的課程」,這個雖然是單次否定了,但仍需要兩個存在量詞表述。

等價於查詢「不存在有學生選了它的課程」。

select **ame from course where not exists (

select * from student where exists (

select * from sc where **o=course.**o and sno=student.sno))

7樓:風嘯無名

沒有資料庫難以具體說明,總的來說,就是乙個多表查詢包括學生基本資訊表、課程資訊表、成績表等,學號為主鍵,查詢姓名和課程、分數等資訊,總分用sum算。

1 。 exists 子查詢找到的提交

not exists 子查詢中 找不到的提交說明:不要去翻譯為存在和不存在,把腦袋搞暈。

2 。 建立程式迴圈的概念,這是乙個動態的查詢過程。如 for迴圈 。

3 。 exists執行的流程exists首先執行外層查詢,再執行記憶體查詢,與in相反。 流程為首先取出外層中的第一元組, 再執行內層查詢,將外層表的第一元組代入,若內層查詢為真,即有結果時。

返回外層表中的第一元 組,接著取出第二元組,執行相同的演算法。一直到掃瞄完外層整表 。

8樓:月光雪松

樓主別著急!

為好理解我們先從這條sql語句所要實現的功能入手。

功能:查出選修了全部課程的學資訊。那麼sql在查詢資料的時候的遍歷每乙個學生資訊。判斷該學生是否滿足條件。

1 如果存在這麼一條course記錄a(暫命名為a), 則不選擇該學生。否則該學生就被查詢出來

2 那麼記錄a,是怎麼查出來的呢?a查出的條件是:不存在sc記錄b,只要不存在b,就可查出a

3 那麼b記錄是什麼?b記錄是選課資訊表,根據學號和課程號可查出記錄b

如果b為空(該學生有沒有選的課程)也就是不存在,則a就有一條記錄,根據規則2可知:因為有a,所以該學生資訊將不被輸出。

如果在sc中每乙個課程編號和該學生編號為條件都能夠查出一條記錄b(也就是該學生選修了全部課程),所以a記錄不存在,則輸出該學生的資訊。

也就是在選課表中,如果學生選了全部課程(也就是滿足select * from sc where sno= student.sno and **o= course.**o)始終存在,當然,課程編號是任意的)。

那麼就輸出該學生的資訊。你不要為理解這條sql而忘記了它本身是要做什麼.

帶著sql的目的(要實現的功能)去理解就好了。

南京s1號線地鐵首班車是幾點,南京地鐵S1號線的地鐵運營

南京南站發車 首發6 00,末班22 00。機場發車 首發6 40,末班22 00。南京地鐵s1號線的地鐵運營 站名往南京南站往祿口機場 首班車尾班車首班車尾班車南京南站 06 0022 00翠屏山站07 0922 2906 0522 05河海大學 佛城西路站07 0522 2506 0922 09...

鑽石s1淨度是不是很差鑽石淨度s1和s2有什麼區別為什麼哪個好

我們是做鑽石的,sl1淨度是明顯的內外部有雜質特徵,算是比較差的鑽石,但是說的是明顯也不是肉眼能看到的,一般都是放大鏡下 會很明顯 求採納 si1屬於小瑕級的鑽石 62616964757a686964616fe78988e69d8331333363393663。鑽石淨度等級的劃分均以十倍放大觀察為標...

多普達s1精英S1 D600 C858 D9000 C720W

建議你用d9000的,九千在多普達中口碑一向不錯,作為一款智慧型手機該有的它都有了,效能方面你想必都知道了我就不多說了,s1就不用考慮了,精英版的也不錯,只是你要的是有硬鍵盤的也可以在不考慮的範圍內,其實這倆款機我都用過,差不多,現在用的是九千,因為有個鍵盤有時在人群中拉出來酷斃了,而且九千的價效比...