史上最も古典的なデータベース面接問題の2つ
既知のリレーションシップモード:
S(SNO,SNAME)学生関係.SNOは学号、SNAMEはC(CNO、CNAME、CTEACHER)という名前のカリキュラム関係です.CNOはカリキュラム番号、CNAMEはカリキュラム名、CTEACHERは担任教師SC(SNO、CNO、SCGRADE)の選択関係である.SCGRADEは成績
1.「李明」先生の講義課程を選択したことがないすべての学生の名前を見つける.
2.2科目以上(2科目を含む)の不合格課程を持つ学生の名前と平均成績をリストする.
3.「1」と「2」の両方を学んだすべての学生の名前をリストします.
4.「1」の成績が「2」の成績より高いすべての学生の学号をリストします.
5.「1」号の成績が「2」号の成績より高いすべての学生の学号とその「1」号の成績と「2」号の成績をリストする.
S(SNO,SNAME)学生関係.SNOは学号、SNAMEはC(CNO、CNAME、CTEACHER)という名前のカリキュラム関係です.CNOはカリキュラム番号、CNAMEはカリキュラム名、CTEACHERは担任教師SC(SNO、CNO、SCGRADE)の選択関係である.SCGRADEは成績
1.「李明」先生の講義課程を選択したことがないすべての学生の名前を見つける.
SELECT SNAME FROM S
WHERE NOT EXISTS(
SELECT * FROM SC, C
WHERE SC.CNO=C.CNO
AND CTEACHER=' '
AND SC.SNO=S.SNO)
2.2科目以上(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
)T
WHERE S.SNO=T.SNO
AND SC.SNO=T.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
)T
WHERE S.SNO=T.SNO
4.「1」の成績が「2」の成績より高いすべての学生の学号をリストします.
SELECT S.SNO, S.SNAME FROM S,
(
SELECT SC1.SNO FROM SC SC1, C C1, SC SC2, C C2
WHERE SC1.CNO=C1.CNO
AND C1.NAME='1'
AND SC2.CNO=C2.CNO
AND C2.NAME='2'
AND SC1.SCGRADE>SC2.SCGRADE
)T
WHERE S.SNO=T.SNO
5.「1」号の成績が「2」号の成績より高いすべての学生の学号とその「1」号の成績と「2」号の成績をリストする.
SELECT S.SNO, S.SNAME, SC.[1 ], SC.[2 ] FROM S,
(
SELECT SC1.SNO, [1 ]=SC1.SCGRADE, [2 ]=SC2.SCGRADE
FROM SC SC1, C C1, SC SC2, C C2
WHERE SC1.CNO=C1.CNO
AND C1.NAME=‘1’
AND SC2.CNO=C2.CNO
AND C2.NAME=‘2’
AND SC1.SCGRADE>SC2.SCGRADE
)T
WHERE S.SNO=T.SNO