SQL 練習題

csbwolf10發表於2009-12-30

問題描述:
已知關係模式:
S (SNO,SNAME)                       學生關係。SNO 為學號,SNAME 為姓名
C (CNO,CNAME,CTEACHER)  課程關係。CNO 為課程號,CNAME 為課程名,CTEACHER 為任課教師
SC(SNO,CNO,SCGRADE)        選課關係。SCGRADE 為成績

要求實現如下5個處理:
  1. 找出沒有選修過“李明”老師講授課程的所有學生姓名
  2. 列出有二門以上(含兩門)不及格課程的學生姓名及其平均成績
  3. 列出既學過“1”號課程,又學過“2”號課程的所有學生姓名
  4. 列出“1”號課成績比“2”號同學該門課成績高的所有學生的學號
  5. 列出“1”號課成績比“2”號課成績高的所有學生的學號及其“1”號課和“2”號課的成績

1. 找出沒有選修過“李明”老師講授課程的所有學生姓名

--實現程式碼:
SELECT SNAME FROM S
WHERE NOT EXISTS(
    SELECT * FROM SC,C
    WHERE SC.CNO=C.CNO
         AND C.CTEACHER='李明'
          AND SC.SNO=S.SNO)

2. 列出有二門以上(含兩門)不及格課程的學生姓名及其平均成績

--實現程式碼:
SELECT S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)
FROM S,SC,(
    SELECT SNO
    FROM SC
    WHERE SCGRADE<60
    GROUP BY SNO
    HAVING COUNT(DISTINCT CNO)>=2
)A WHERE S.SNO=A.SNO AND SC.SNO=A.SNO
GROUP BY S.SNO,S.SNAME

3. 列出既學過“1”號課程,又學過“2”號課程的所有學生姓名

--實現程式碼:
SELECT S.SNO,S.SNAME
FROM S,(
    SELECT SC.SNO
    FROM SC,C
    WHERE SC.CNO=C.CNO
        AND C.CNAME IN('1','2')
    GROUP BY SNO
    HAVING COUNT(DISTINCT CNO)=2
)SC WHERE S.SNO=SC.SNO

4. 列出“1”號課成績比“2”號同學該門課成績高的所有學生的學號

--實現程式碼:
SELECT S.SNO,S.SNAME
FROM S,SC SC1,SC SC2
    WHERE SC1.CNO='1'
        AND SC2.SNO='2'
        AND SC1.CNO=S.CNO
        AND SC1.SCGRADE>SC2.SCGRADE

5. 列出“1”號課成績比“2”號課成績高的所有學生的學號及其“1”號課和“2”號課的成績

--實現程式碼:
SELECT SC1.SNO,[1號課成績]=SC1.SCGRADE,[2號課成績]=SC2.SCGRADE
FROM SC SC1,SC SC2
WHERE SC1.CNO='1'
        AND SC2.CNO='2'
        AND SC1.SNO=SC2.SNO
        AND SC1.SCGRADE>SC2.SCGRADE

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10113559/viewspace-623944/,如需轉載,請註明出處,否則將追究法律責任。