高考申論題
106年
[資訊處理] 資料庫應用
第 三 題
📖 題組:
一個大學課程關聯資料庫包含下列關係:(每小題 5 分,共 20 分) STUDENT(S#, Sname, Saddress, D#), TEACHER(T#, Tname, Taddress, D#), COURSE(C#, Cname, CreditHour), TAKE_COURSE(S#, C#, Score), OFFER(T#, C#, Classroom) 寫出下列查詢的 SQL 描述: (一) 找出學生姓名與其曾經修過某位老師剛好兩門課的老師姓名 (二) 找出從來沒有被當過(所有課程 Score ≧ 60)的學生姓名 (三) 找出修過名稱為‘John’開設所有課程並且都被當掉的學生 (四) 列出所有學生的姓名與總學分數(CreditHour)與修過課程的平均分數
一個大學課程關聯資料庫包含下列關係:(每小題 5 分,共 20 分) STUDENT(S#, Sname, Saddress, D#), TEACHER(T#, Tname, Taddress, D#), COURSE(C#, Cname, CreditHour), TAKE_COURSE(S#, C#, Score), OFFER(T#, C#, Classroom) 寫出下列查詢的 SQL 描述: (一) 找出學生姓名與其曾經修過某位老師剛好兩門課的老師姓名 (二) 找出從來沒有被當過(所有課程 Score ≧ 60)的學生姓名 (三) 找出修過名稱為‘John’開設所有課程並且都被當掉的學生 (四) 列出所有學生的姓名與總學分數(CreditHour)與修過課程的平均分數
📝 此題為申論題,共 4 小題
小題 (三)
找出修過名稱為‘John’開設所有課程並且都被當掉的學生
思路引導 VIP
這是一道經典的「全稱量詞(For All)」查詢題,在關聯代數中對應「除法(Division)」運算。遇到「所有」這類字眼,在 SQL 中通常有兩種解法:一是使用雙重 NOT EXISTS 將邏輯轉換為「不存在一門 John 開的課,該學生沒有被當」;二是利用 GROUP BY 與 COUNT,比較「學生被當掉的 John 的課程數」是否等於「John 總共開設的課程數」。
小題 (一)
試以最適當且最少個關聯資料表(relation),來描述上述之實體關聯圖。需寫出該些關聯資料表的名稱、所含之屬性及主要鍵。(10 分)
思路引導 VIP
看到此題,應立即運用「ER 模型轉換為關聯綱目」的標準規則。先將強實體獨立建表;接著處理 M:N 關聯,必須獨立建表並納入兩端主鍵與關聯屬性;最後處理弱實體與 1:N 識別關聯,弱實體不需獨立的關聯表,而是直接將擁有者(Owner)的主鍵作為外鍵納入,並與自身的部分鍵組成複合主鍵。
小題 (二)
對於上述之關聯資料表(relation),於撰寫程式時,那些屬性之間應設定為參考完整性限制(Referential integrity constraint),那些外來鍵屬性(foreign key)必須設為不可為空值(Non-Null)。(10 分)
思路引導 VIP
遇到 ERD 轉關聯綱目題目,首先將實體與關聯轉換為標準關聯表(Relation)。多對多關聯(Assignment)與弱實體關聯(Dependent)皆會產生外來鍵,接著依據實體完整性(主鍵不可為空)與依賴關係來判斷哪些外來鍵必須加上 Non-Null 限制。
小題 (四)
列出所有學生的姓名與總學分數(CreditHour)與修過課程的平均分數
思路引導 VIP
看到題目要求「所有學生」與各種統計數值(總計、平均),應直覺聯想到需使用 LEFT JOIN 保留所有學生紀錄,並搭配 GROUP BY 分組。最後利用聚合函數 SUM() 與 AVG() 計算學分數與分數。