PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 七嘴八舌異言堂
帳戶
密碼
 

  回應
 
主題工具
s0510510
Advance Member
 
s0510510的大頭照
 

加入日期: Apr 2004
文章: 336
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

但是這樣的表達方法沒有辦法蠻族題目要列出含第五門課程的學生
所以想請教版上各位大大,可以給小第一點意見
感恩的心,感謝有您
     
      
__________________
舊 2008-05-11, 09:11 PM #1
回應時引用此文章
s0510510離線中  
saiz
Golden Member
 
saiz的大頭照
 

加入日期: Aug 2004
您的住址: 北極星
文章: 2,601
嗯...也許是我想得簡單了
我是覺得
直接從Take表格中 找出同一S#重覆五筆以上者
這樣就可以了
因為出現在Take中的S# 表現該學生有修課
出現愈多次 修愈多課
有幾次 就是修了幾堂課
再找出該S#代表的學生姓名即可

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

推薦好站Android Forum中文討論區
舊 2008-05-11, 09:47 PM #2
回應時引用此文章
saiz離線中  
littlehorse
Basic Member
 

加入日期: Oct 2003
您的住址: 居無定所
文章: 10
最後面的Having 改成>4應該就可以了吧...
代表修課大於四門以上...
或者
>=5 即代表修課數達五門(包含)以上的學生...
舊 2008-05-11, 09:48 PM #3
回應時引用此文章
littlehorse離線中  
Devil
Power Member
 

加入日期: Jan 2001
您的住址: Taipei
文章: 503
用>4應該會比較好
>4只需一道判斷,>=5需要2道判斷
__________________
舊 2008-05-11, 10:10 PM #4
回應時引用此文章
Devil離線中  
s0510510
Advance Member
 
s0510510的大頭照
 

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

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

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

大大所提的想法是直接重Relationship去篩選資料
因為小弟學到的都是從Entity利用子查詢篩選
壓根沒想過這樣做法,多謝大大提供另外的想法
__________________
舊 2008-05-11, 10:51 PM #5
回應時引用此文章
s0510510離線中  
student
Amateur Member
 
student的大頭照
 

加入日期: Jul 2005
文章: 36
select S_name from student where s# in (select s# distinct from Take group by s# having count(s#) > 4)
__________________
讓我獨中大樂透頭獎
舊 2008-05-11, 10:55 PM #6
回應時引用此文章
student離線中  
s0510510
Advance Member
 
s0510510的大頭照
 

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

>4小弟現在懂了,因為不知道SQL有>=的符號
(對沒有RUN過程式的小弟知道東西太少)
小弟看到>=5突然有一種疑問,如果小弟沒記錯
在程式中 = = 是代表等於的意思
= 不適代表指定變數的定義
那用 >=5可以行得通嗎?
小弟謝謝大大的說明,感恩
__________________
舊 2008-05-11, 10:56 PM #7
回應時引用此文章
s0510510離線中  
s0510510
Advance Member
 
s0510510的大頭照
 

加入日期: Apr 2004
文章: 336
引用:
作者Devil
用>4應該會比較好
>4只需一道判斷,>=5需要2道判斷

大大要說的意思是應該是像資料結構中的Tree
去做編碼、解碼時,用0電腦判斷比較快
用1電腦判斷會比較慢(以上是課堂上老師說的)
我想大大應該是這樣的意思
多謝大大提供這樣的想法,感恩
__________________
舊 2008-05-11, 11:03 PM #8
回應時引用此文章
s0510510離線中  
Devil
Power Member
 

加入日期: Jan 2001
您的住址: Taipei
文章: 503
引用:
作者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
__________________
舊 2008-05-11, 11:09 PM #9
回應時引用此文章
Devil離線中  


s0510510
Advance Member
 
s0510510的大頭照
 

加入日期: Apr 2004
文章: 336
引用:
作者student
select S_name from student where s# in (select s# distinct from Take group by s# having count(s#) > 4)

版上真是臥虎藏龍,小弟還在想要怎樣將2樓大大的想法改成程式
大大就已經將程式寫出來,看來小弟這方面還有很大的進步空間
多謝大大給小弟對於該題另外解法,感恩
__________________
舊 2008-05-11, 11:09 PM #10
回應時引用此文章
s0510510離線中  
    回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



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


vBulletin Version 3.0.1
powered_by_vbulletin 2025。