sql求解1查詢選修了軟體工程課程學生的學號

2021-03-04 02:04:37 字數 5179 閱讀 1696

1樓:匿名使用者

我汗,你連個表結構都沒有,讓人怎麼回答。

2樓:匿名使用者

其實我很好奇 前兩個問題是啥 lz沒貼出來

3樓:匿名使用者

憂固畢應券娛恆了夜爪

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的目的(要實現的功能)去理解就好了。

SQL查詢全部學生都選修的課程的課程號和課程名問題

首先,簡單的把課程表與選修表關聯,course join study on course.cid study.cid 然後 按照課程號和課程名分組,group by course.cid,course.ame 最後,要求 選修的人數 學生總數 having count study.sid selec...

用SQL語句查詢每個學生選修的課程名及其成績

select 姓名,課程名,成績 from 課程名所在的表名 c join 成績所在的表名 s on c.課程號 s.課程號 join 學生資訊表 on s.學號 學生資訊表.學號 具體的例子 select sname,ame,grade from student st left join scor...

sql自連線查詢至少選修了三門課程的學生的學生號

假設有學生表 student 課程表 course 學生課程關聯表 stu cou 學生的學號為student表的主鍵,那麼 select sno from stu cou group by sno having count o 3 資料庫查詢至少選修了3門課程的所有學生辦法 select from...