SQL文の面接問題

1813 ワード

昨日面接に行った会社では、筆記試験の問題はほかにもよかったです.ここ数年のプロジェクトではORMのフレームワークで多くのsql文で答えた部分がぼろぼろになっていますが、この会社ではsqlが一番多く使われています.残念ですが、今まとめましょう.
既知のリレーションシップモード:
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」号の授業の成績の解題をリストします:
1.「李明」先生の講義課程を選択していないすべての学生の名前を探し出す
select sname as      from s where s.sno not exists 
(select sc.sno from sc ,c where sc.cno=c.cno and c.cteacher =’  ’)

2.2科目以上(2科目を含む)の不合格課程を持つ学生の名前と平均成績をリストする
select s.sname as     , AVG(sc.scgrade)as      from s,sc 
where sc.son in(select sc.sno from sc where sc.scgrade <60 group by sc.sno  having count(*)>1) 
group by s.sno , s.sname 

3.「01」と「02」の両方を学んだすべての学生の名前をリストします
select s.sname as      from s where s.son in 
( select sc.sno where sc.cno in(‘01’,‘02’) group by sc.sno having count(distinct sc.cno)==2)

4.「01」号の成績が「02」号の学生より高いすべての学生の学号をリストする
select s.sno as    from
 (select * from sc where sc.cno=1) as sc1,
 select * from sc where sc.con=2) as sc2 
join s on s.sno=s1.sno 
where sc1.sno=sc2.sno and sc1.scgrade>sc2.scgrade

5.「01」号の成績が「02」号の成績より高いすべての学生の学号とその「01」号の成績と「02」号の成績をリストする
select s.sno as   , sc1.scgrade as no1g,sc2.scgrade as no2g from
 (select * from sc where sc.cno=1) as sc1, 
select * from sc where sc.con=2) as sc2 
join s on s.sno=s1.sno
 where sc1.sno=sc2.sno and sc1.scgrade>sc2.scgrade

4つ目と5つ目の考察点は、個人的には効率的で、そうすべきではないと思いますが、しばらくは答えがありません.出題者はそんなに知恵が弱いわけではありません.後で理解してから更新しましょう.