SQL語句的一個面試題目

昨天去面試了家公司,筆試題別的都挺好,因爲近幾年項目中用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

第四個和第五個的考察點,個人感覺應該是效率,不應該這麼處理,但暫時也沒答案,出題人應該不至於這麼弱智,以後想明白再更新吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章