sql筆試題整理
題記:一直在寫各種sql查詢語句,最長的有一百多行,自信什麽需求都可以接,可。。。。。。,想了想,可能一直在固定的場景下寫,平時也是以滿足實際需求為目的,竟不知道應試的題都是怎麽出的,又應該怎麽做。遂找來一些筆試題來練習。
有四張表如下格式存儲:
--1、查詢“001”課程比“002”課程成績高的所有學生的學號;
select t1.s# from
(select s#,c#,score from sc where c# = 001) t1 inner join (select s#,c#,score from sc where c# = 002) t2
on t1.s#=t2.s#
where t1.score > t2.score
--2、查詢平均成績大於60分的同學的學號和平均成績;
select s#,average(score)
from sc
where average(score)>60 group by s#
--3、查詢所有同學的學號、姓名、選課數、總成績;
select student.s#,student.sname,count(sc.c#),sum(sc.score)
from student left join sc on student.s#=sc.s#
group by student.s#,student.sname
--4、查詢姓“李”的老師的個數;
select count(t#)
from teacher
where tname like ‘李%‘
--5、查詢沒學過“葉平”老師課的同學的學號、姓名;
select t1.s#,t1.sname
from student t1
left join sc t2 on t1.s#=t2.s#
left join course t3 on t2.c#=t3.c#
left join teacher t4 on t3.t#=t4.t#
where t4.tname != ‘葉平‘
--6、查詢學過“001”並且也學過編號“002”課程的同學的學號、姓名;
select t0.s#,t0.sname
from student t0
inner join (select s#,c#,score from sc where c# = 001) t1
on t0.s#=t1.s#
inner join (select s#,c#,score from sc where c# = 002) t2
on t0.s#=t2.s#
--7、查詢學過“葉平”老師所教的所有課的同學的學號、姓名;
select t1.s#,t1.sname
from student t1
left join sc t2 on t1.s#=t2.s#
left join course t3 on t2.c#=t3.c#
left join teacher t4 on t3.t#=t4.t#
where t4.tname = ‘葉平‘
--8、查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名;
select t0.s#,t0.sname
from student t0
inner join (select s#,c#,score from sc where c# = 001) t1
on t0.s#=t1.s#
inner join (select s#,c#,score from sc where c# = 002) t2
on t0.s#=t2.s#
where t2.score<t1.score
--9、查詢所有課程成績小於60分的同學的學號、姓名;
select t1.s#,t1.sname
from student t1
inner join (select s#,count(c#),count(if(score<60,c#,null)) from sc where count(c#) = count(if(score<60,c#,null))) t2
on t1.s#=t2.s#
group by t1.s#,t1.sname
--10、查詢沒有學全所有課的同學的學號、姓名;
--11、查詢至少有一門課與學號為“1001”的同學所學相同的同學的學號和姓名;
--12、查詢至少學過學號為“001”同學所有一門課的其他同學學號和姓名;
--13、查詢和“1002”號的同學學習的課程完全相同的其他同學學號和姓名;
--14、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
select c#,max(score),min(score)
from sc
group by c#
--15、按各科平均成績從低到高和及格率的百分數從高到低順序
--16、查詢如下課程平均成績和及格率的百分數(用"1行"顯示): 企業管理(001),馬克思(002),OO&UML (003),數據庫(004)
--17、查詢不同老師所教不同課程平均分從高到低顯示
select t2.cname,t3.tname,average(t1.score)
from sc t1
inner join course t2 on t1.c#=t2.c#
inner join teacher t3 on t2.t#=t3.t#
group by t2.cname,t3.tname
order by average(t1.score) desc
--18、查詢如下課程成績第 3 名到第 6 名的學生成績單:企業管理(001),馬克思(002),UML (003),數據庫(004)
select * from
(select t1.s#,t1.sname,t2.c#,t2.score,row_number() over(partition by t2.c# order by t2.score desc) num
from student t1
inner join sc t2 on t1.s#=t2.s#
where c# in (001,002,003,004)) t
where t.num >=3 and t.num<=6
--19、統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[ <60]
select t1.c#,t2.cname,case when t1.score >=85 then [100-85] when (t1.score <85 and t1.score >=70) then [85-70] when (t1.score <70 and t1.score >=60) then [70-60] when t1.score <60 then [ <60] end as score, count(t1.s#)
from sc t1
inner join course t2 on t1.c#=t2.c#
group by t1.c#,t2.cname
--20、查詢學生平均成績及其名次
select t1.s#,t1.sname,average(t2.score),row_number() over(order by average(t2.score)) as ranking
from student t1
inner join sc t2 on t1.s#=t2.s#
--21、查詢各科成績前三名的記錄:(不考慮成績並列情況)
select * from
(select t1.s#,t1.sname,t2.c#,t2.score,row_number() over(partition by t2.c# order by t2.score desc) num
from student t1
inner join sc t2 on t1.s#=t2.s#
) t
where t.num <=3
--22、查詢每門課程被選修的學生數
select c#,count(s#)
from sc group by c#
--23、查詢出只選修了一門課程的全部學生的學號和姓名
select t1.s#,t2.sname
from sc t1
inner join student t2 on t1.s#=t2.s#
where count(t1.c#)=1
group by t1.s#,t2.sname
--24、查詢男生、女生人數
select ssex,count(s#)
from student group by ssex
--25、查詢姓“張”的學生名單
select s#,sname
from student
where sname like ‘張%‘
--26、查詢同名同性學生名單,並統計同名人數
select sname,count(s#)
from student
where count(s#)>1
group by sname
--27、1981年出生的學生名單(註:Student表中Sage列的類型是datetime)
--28、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列
--29、查詢平均成績大於85的所有學生的學號、姓名和平均成績
select t1.s#,t2.sname,average(t1.score)
from sc t1 inner join student t2 on t1.s#=t2.s#
where average(t1.score)>85 group by t1.s#
--30、查詢課程名稱為“數據庫”,且分數低於60的學生姓名和分數
select t0.sname,t1.score
from student t0
inner join sc t1 on t0.s#=t1.s#
inner join course t2 on t1.c#=t2.c#
where t2.cname = ‘數據庫‘ and t1.score<60
--31、查詢所有學生的選課情況;
select t1.s#,t1.sname,t2.c#,t3.cname
from student t1
left join sc t2 on t1.s#=t2.s#
inner join course t3 on t2.c#=t3.c#
--32、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;
select t1.sname,t3.cname,t2.score
from student t1
inner join sc t2 on t1.s#=t2.s#
inner join course t3 on t2.c#=t3.c#
where t2.score>70
--33、查詢不及格的課程,並按課程號從大到小排列
--34、查詢課程編號為003且課程成績在80分以上的學生的學號和姓名;
select t1.s#,t1.sname
from student t1
inner join sc t2 on t1.s#=t2.s#
inner join course t3 on t2.c#=t3.c#
where t3.c#=003 and t2.score>80
--35、求選了課程的學生人數
select count(distinct s#)
from sc
--36、查詢選修“葉平”老師所授課程的學生中,成績最高的學生姓名及其成績
--37、查詢各個課程及相應的選修人數
select c#,count(s#)
from sc
group by c#
--38、查詢不同課程成績相同的學生的學號、課程號、學生成績
--39、查詢每門功成績最好的前兩名
--40、統計每門課程的學生選修人數(超過10人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,查詢結果按人數降序排列,若人數相同,按課程號升序排列
--41、檢索至少選修兩門課程的學生學號
select s#
from sc
where count(c#)>=2
group by s#
--42、查詢全部學生都選修的課程的課程號和課程名
--43、查詢沒學過“葉平”老師講授的任一門課程的學生姓名
--44、查詢兩門以上不及格課程的同學的學號及其平均成績
--45、檢索“004”課程分數小於60,按分數降序排列的同學學號
select s#,score
from sc
where c#=004 and score<60
order by score desc
以上,均為自己所寫,如有錯誤,敬請指教
sql筆試題整理