莫愁前路无知己,天下谁人不识君。。。。

关于一道SQL面试题的问题争议

上一篇 / 下一篇  2017-04-15 15:45:11 / 个人分类:软件面试问题

--------用一条SQL语句查询出每门课都大于80分的学生姓名-------面试经常被问到,其实答案并不是很关键,关键是该题所引发的思考,好了,还是先看题,有一张分数表test:

name   course   mark
张三     语文       95
张三     数学       82
李四     语文       74
李四     数学       96
李四     英语       92
王五     语文       72
王五     数学       100
王五     英语       73

way1:select name from test group by name having min(mark)>80;

way2:select distinct name from test where name not in (select distict name from test where mark <=80);

way3:select distict name from test A where not exists (select course from test where mark<80 and name = A.name) #此处course 可以用* 代替

way4:select name from test group by name having name not in (select name from test where mark<=80);

way5:select name from test group by name having count(mark)=sum(case when mark>80 then 1 else 0 end);

基本上以上5中方法可以应付这道题,但是,你有没有发现张三的英语没有统计,缺考啦,如果张三有英语课程,但没有分数(不是0分),结果会是怎样?查出来的结果是你想要的吗???
行转列:
select name ,
sum(case when course = "语文" then mark end)"语文",
sum(case when course = "数学" then mark end)"数学",
sum(case when course = "英语" then mark end)"英语",
from test group by name;

TAG: SQL sql 面试

 

评分:0

我来说两句

Open Toolbar