免費開始練習
地特三等申論題 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)與修過課程的平均分數
📝 此題為申論題,共 4 小題

小題 (一)

找出學生姓名與其曾經修過某位老師剛好兩門課的老師姓名

思路引導 VIP

這是一題典型的關聯與聚合函數應用。首先找出能串連「學生」、「修課」、「開課」與「老師」的四張資料表並建立 JOIN 條件,接著以學生與老師為群組 (GROUP BY) 計算課程數量,最後利用 HAVING 篩選出數量剛好等於 2 的組合。

🤖
AI 詳解
AI 專屬家教

【解題關鍵】使用 JOIN 連結多張資料表,並運用 GROUP BY 搭配 HAVING COUNT() = 2 篩選特定數量的群組。 【解答】

小題 (二)

找出從來沒有被當過(所有課程 Score ≧60)的學生姓名

思路引導 VIP

看到「所有...都符合...」或「從來沒有...」的條件,應直覺想到兩種解法:一是使用 GROUP BY 搭配 HAVING 條件判斷學生的最低分;二是使用反向排除法,利用 NOT IN 或 NOT EXISTS 排除掉曾經有成績 < 60 的學生。

🤖
AI 詳解
AI 專屬家教

【解題關鍵】利用分組函數檢查最低成績,或用子查詢排除曾有不及格紀錄的學生。 【解答】 解法一:使用 GROUP BY 與 HAVING(邏輯最直覺)

小題 (三)

找出修過名稱為‘John’開設所有課程並且都被當掉的學生

思路引導 VIP

這題考查 SQL 中處理「全稱量詞(All/Every)」的查詢能力,屬於關聯代數中的「除法(Division)」概念。解題時可思考兩種策略:一是使用「雙重 NOT EXISTS」(不存在一門 John 開的課,該學生沒有被當掉);二是使用「COUNT 聚合」(該學生修過 John 開且被當掉的課程總數 = John 開設的課程總數)。

🤖
AI 詳解
AI 專屬家教

【解題關鍵】使用雙重 NOT EXISTS(除法運算)或 GROUP BY 配合 COUNT 函數來處理「所有(All)」的條件限制。 【解答】 針對本題,提供兩種常見且正確的 SQL 寫法:

小題 (四)

列出所有學生的姓名與總學分數(CreditHour)與修過課程的平均分數

思路引導 VIP

看到「所有學生」、「總」、「平均」等關鍵字,應立刻聯想到必須使用 LEFT JOIN(保留未修課學生)以及 GROUP BY 搭配聚合函數 SUM()、AVG()。解題時需串聯 STUDENT、TAKE_COURSE 與 COURSE 三個資料表來取得計算所需的數值欄位。

🤖
AI 詳解
AI 專屬家教

【解題關鍵】使用 LEFT JOIN 確保涵蓋所有學生,並利用 GROUP BY 搭配 SUM() 與 AVG() 函數進行統計。 【解答】

升級 VIP 解鎖