zoukankan      html  css  js  c++  java
  • 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 )就用到上一篇说的分组排序哦,
  • 相关阅读:
    LeetCode485 最大连续1的个数
    LeetCode167 两数之和 II
    js浮点数类型
    js整数类型
    js布尔类型
    js重复赋值 js数据交换 js调式方法
    JavaScript变量
    数据类型分类
    重复赋值 数据交换 查看程序执行结果
    JS注释 JS变量
  • 原文地址:https://www.cnblogs.com/WNof11020520/p/9058166.html
Copyright © 2011-2022 走看看