PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   SQL 的問題 (https://www.pcdvd.com.tw/showthread.php?t=793595)

s0510510 2008-05-11 09:11 PM

SQL 的問題
 
各位大大好,小弟因為準備考試要考到DB
而小弟又非資訊類的本科系,所以佔用PCDVD資源來發問
請各位大大幫小弟一個忙
-----------------------
題目是
設一學校資料庫有以下之關連(relations),Student{S#,S_name,S_address}、Take{S#,C#,Grade}、Course{C#,C_name},Student和Course分別記錄的是學生和課程的資料,Take記錄的是每個學生(S#)修了哪些課程(C#),以及分別在這些課程所得到成績(Grade)。設一個學生可以同時修多門課程,且一個課程可以同時被多個學生修,試問:使用SQL寫出查詢”所有修了5門(含)以上課程的學生名字”。

小弟目前想法是
SELECT S_name
FROM Student,Take
WHERE Take.S# = = Student.S#
GROUP BY Student.S#
HAVING COUNT(*)>5

但是這樣的表達方法沒有辦法蠻族題目要列出含第五門課程的學生
所以想請教版上各位大大,可以給小第一點意見
感恩的心,感謝有您

saiz 2008-05-11 09:47 PM

嗯...也許是我想得簡單了
我是覺得
直接從Take表格中 找出同一S#重覆五筆以上者
這樣就可以了
因為出現在Take中的S# 表現該學生有修課
出現愈多次 修愈多課
有幾次 就是修了幾堂課
再找出該S#代表的學生姓名即可

至於你的SQL
最後改成HAVING COUNT(*)>4
應該就可以了吧 大於4 就包含5了
不過....不是也可以用>=嗎 為什麼不用呢?

littlehorse 2008-05-11 09:48 PM

最後面的Having 改成>4應該就可以了吧...
代表修課大於四門以上...
或者
>=5 即代表修課數達五門(包含)以上的學生...

Devil 2008-05-11 10:10 PM

用>4應該會比較好
>4只需一道判斷,>=5需要2道判斷

s0510510 2008-05-11 10:51 PM

引用:
作者saiz
嗯...也許是我想得簡單了
我是覺得
直接從Take表格中 找出同一S#重覆五筆以上者
這樣就可以了
因為出現在Take中的S# 表現該學生有修課
出現愈多次 修愈多課
有幾次 就是修了幾堂課
再找出該S#代表的學生姓名即可

至於你的SQL
最後改成HAVING COUNT(*)>4
應該就可以了吧 大於4 就包含5了
不過....不是也可以用>=嗎 為什麼不用呢?

最後改成HAVING COUNT(*)>4,應該就可以了吧 大於4 就包含5了=>大大這句話真是一與驚醒夢中的小弟,小弟腦袋轉不過來@@

大大所提的想法是直接重Relationship去篩選資料
因為小弟學到的都是從Entity利用子查詢篩選
壓根沒想過這樣做法,多謝大大提供另外的想法

student 2008-05-11 10:55 PM

select S_name from student where s# in (select s# distinct from Take group by s# having count(s#) > 4)

s0510510 2008-05-11 10:56 PM

引用:
作者littlehorse
最後面的Having 改成>4應該就可以了吧...
代表修課大於四門以上...
或者
>=5 即代表修課數達五門(包含)以上的學生...

>4小弟現在懂了,因為不知道SQL有>=的符號
(對沒有RUN過程式的小弟知道東西太少)
小弟看到>=5突然有一種疑問,如果小弟沒記錯
在程式中 = = 是代表等於的意思
= 不適代表指定變數的定義
那用 >=5可以行得通嗎?
小弟謝謝大大的說明,感恩

s0510510 2008-05-11 11:03 PM

引用:
作者Devil
用>4應該會比較好
>4只需一道判斷,>=5需要2道判斷

大大要說的意思是應該是像資料結構中的Tree
去做編碼、解碼時,用0電腦判斷比較快
用1電腦判斷會比較慢(以上是課堂上老師說的)
我想大大應該是這樣的意思
多謝大大提供這樣的想法,感恩

Devil 2008-05-11 11:09 PM

引用:
作者student
select S_name from student where s# in (select s# distinct from Take group by s# having count(s#) > 4)

基本上不建議使用IN子句,以SQL Server為例,這樣下SQL Query將無法套用Index

s0510510 2008-05-11 11:09 PM

引用:
作者student
select S_name from student where s# in (select s# distinct from Take group by s# having count(s#) > 4)

版上真是臥虎藏龍,小弟還在想要怎樣將2樓大大的想法改成程式
大大就已經將程式寫出來,看來小弟這方面還有很大的進步空間
多謝大大給小弟對於該題另外解法,感恩


所有的時間均為GMT +8。 現在的時間是11:24 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。