3.取出每个班级分数排在前两位的学生

现在有一个表:成绩表grade,有四个班级的学生,现在问题是:取出每个班级分数为前两名的 学生信息

这个问题的解决办法有很多,在此刻我的方法是,

select sname, class, score from grade where (
  select count(*) from grade as f where f.class=grade.class and f.score>=grade.score
) <= 2;

说明:一个外表grade 一个内表f, grade每查询一条数据 a 时,f表都会查询整个表中 与 数据 a的class相等,且score>=a.score ,且满足这两个条件的个数<=2,

满足了这三个条件说明 这条数据就是某个班级里面 分数在前两位的学生了。

查询的结果: 

这个结果, 达到了我们的目的。

比方说:还是上面的表 grade , 现在想查询 每个班级分数倒数两位的同学 

sql: 

select sname, class, score from grade where (
select count(*) from grade as f where f.class=grade.class and f.score<=grade.score
) <=2;

 就是第二个分数比较的条件改变了,思路一样。

比方说:还是上面的表 grade , 现在想查询 每个班级分数倒数第一的同学

 sql:

select sname, class, score from grade where (
select count(*) from grade as f where f.class=grade.class and f.score<=grade.score
) =1;

 ---------------------------------------------------------------------------------

回到上面的话题,假如说我要查询grade表中 每个班级分数排名前两位的学生,并每个班级学生分数从大到小排列

(你会发现前面查询到的结果,每个班级的学生都没按分数大小排序的哦),那怎样让查询到的结果,每个班级里面的学生按分数从大到小排序呢?

解决办法分两步: 1.首先将grade表按班级分组,每组按升序排列: select * from grade order by class asc, score desc

                     2.在步骤1的查询结果基础上,查询每个班级前两名的学生。

最终的sql就是这样:

1 select sname, class, score from (select * from grade order by class, score desc ) grade where ( 
2   select count(*) from grade as f where f.class = grade.class and f.score>=grade.score 
3 )<= 2;

结果:

结果我们可以看到,每个班级里面的分数最大的两个学生也是按分数从大到小排列的,这就达到了我们的目的了。

(select * from grade order by class, score desc )就用到上一篇说的分组排序哦,
原文地址:https://www.cnblogs.com/WNof11020520/p/9058166.html