昨天去面試了家公司,筆試題別的都挺好,因爲近幾年項目中用ORM框架比較多sql語句答題部分一塌糊塗,而這家公司sql用的最多,很遺憾,現在做個總結吧
已知關係模式:
s (sno,sname) 學生關係。sno 爲學號,sname 爲姓名
c (cno,cname,cteacher) 課程關係cno 爲課程號,cname 爲課程名,cteacher 爲任課教師
sc(sno,cno,scgrade) 選課關係。scgrade 爲成績
1.找出沒有選修過“李明”老師講授課程的所有學生姓名
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. 列出有二門以上(含兩門)不及格課程的學生姓名及其平均成績
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
第四個和第五個的考察點,個人感覺應該是效率,不應該這麼處理,但暫時也沒答案,出題人應該不至於這麼弱智,以後想明白再更新吧