阿摩線上測驗 登入

申論題資訊

試卷:110年 - 110 公務升官等考試_薦任_資訊處理:資料庫應用#103677
科目:公職◆資料庫應用
年份:110年
排序:0

題組內容

四、根據以下關聯資料表架構,老師可開設多門課程,同一門課可以有多位教師,學生也可以修多門課程,修過課程就會有分數。
student(SID, Sname, Sage, Ssex)// 學生編號, 姓名, 年紀, 性別
course(CID, Cname, TID)// 課程編號, 課名, 教師編號
 teacher(TID, Tname)// 教師編號, 教師名稱
 score(SID, CID, sc)// 學生編號, 課程編號, 分數
寫出以下 SQL 查詢

申論題內容

(五)查詢沒有學過全部課程的同學的編號。(10 分)

詳解 (共 3 筆)

詳解 提供者:114年高考上榜

以下是查詢沒有學過全部課程的同學的編號的 SQL 語句:

 
 
SELECT s.SID
FROM student s
LEFT JOIN score sc ON s.SID = sc.SID
GROUP BY s.SID
HAVING COUNT(DISTINCT sc.CID) < (SELECT COUNT(*) FROM course)
解釋:
 
使用 LEFT JOIN 將 student 和 score 表關聯起來,以便確定每個學生是否已修過課程。
使用 GROUP BY 按學生分組,以便進行聚合計算。
使用 HAVING 條件篩選出那些沒有修過全部課程的學生,即已修過課程的數量小於全部課程的數量。在此使用了子查詢來獲取全部課程的數量。
選擇需要的結果,即學生的編號。
詳解 提供者:正在努力爬上岸
SELECT SID
FROM student
WHERE SID NOT IN (
    SELECT s.SID
    FROM student s,score sc,course c
    WHERE s.SID=sc.SID AND c.CID=sc.CID
    GROUP BY s.SID
    HAVING COUNT(DISTINCT c.CID) = (SELECT COUNT(*) FROM course)
);
 
利用子查詢來計算每位學生所修過的不同課程數量,再與總課程數量相比較,找出沒有學過全部課程的學生編號。
詳解 提供者:邊工作邊唸書
 
SELECT S.SID FROM student S 
WHERE EXISTS (
SELECT * FROM course C
WHERE NOT EXISTS (
SELECT * FROM score SC
WHERE S.SID=SC.SID AND C.CID=SC.CID));