地特三等申論題
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 小題
小題 (一)
找出學生姓名與其曾經修過某位老師剛好兩門課的老師姓名
思路引導 VIP
這是一題典型的關聯與聚合函數應用。首先找出能串連「學生」、「修課」、「開課」與「老師」的四張資料表並建立 JOIN 條件,接著以學生與老師為群組 (GROUP BY) 計算課程數量,最後利用 HAVING 篩選出數量剛好等於 2 的組合。
小題 (二)
找出從來沒有被當過(所有課程 Score ≧60)的學生姓名
思路引導 VIP
看到「所有...都符合...」或「從來沒有...」的條件,應直覺想到兩種解法:一是使用 GROUP BY 搭配 HAVING 條件判斷學生的最低分;二是使用反向排除法,利用 NOT IN 或 NOT EXISTS 排除掉曾經有成績 < 60 的學生。
小題 (三)
找出修過名稱為‘John’開設所有課程並且都被當掉的學生
思路引導 VIP
這題考查 SQL 中處理「全稱量詞(All/Every)」的查詢能力,屬於關聯代數中的「除法(Division)」概念。解題時可思考兩種策略:一是使用「雙重 NOT EXISTS」(不存在一門 John 開的課,該學生沒有被當掉);二是使用「COUNT 聚合」(該學生修過 John 開且被當掉的課程總數 = John 開設的課程總數)。
小題 (四)
列出所有學生的姓名與總學分數(CreditHour)與修過課程的平均分數
思路引導 VIP
看到「所有學生」、「總」、「平均」等關鍵字,應立刻聯想到必須使用 LEFT JOIN(保留未修課學生)以及 GROUP BY 搭配聚合函數 SUM()、AVG()。解題時需串聯 STUDENT、TAKE_COURSE 與 COURSE 三個資料表來取得計算所需的數值欄位。