首先问题:

然后答案:

SELECTa.id,a.score AS Score,COUNT( DISTINCT b.score ) AS Rank
FROMscores a,scores b
WHEREb.score >= a.score
GROUP BYa.id
ORDER BYa.score DESC

分步骤理解(sql拆解理解):

前提:要简单理解sql执行顺序, 和"笛卡尔积"的概念

  1. SELECT*
    FROMscores a,scores b
    

    拆解之后得到结果:

    id    score   id(1)   score(1)
    1   3.50    1   3.50
    2   3.65    1   3.50
    3   4.00    1   3.50
    4   3.85    1   3.50
    5   4.00    1   3.50
    6   3.65    1   3.50
    1   3.50    2   3.65
    2   3.65    2   3.65
    3   4.00    2   3.65
    4   3.85    2   3.65
    5   4.00    2   3.65
    6   3.65    2   3.65
    1   3.50    3   4.00
    2   3.65    3   4.00
    3   4.00    3   4.00
    4   3.85    3   4.00
    5   4.00    3   4.00
    6   3.65    3   4.00
    1   3.50    4   3.85
    2   3.65    4   3.85
    3   4.00    4   3.85
    4   3.85    4   3.85
    5   4.00    4   3.85
    6   3.65    4   3.85
    1   3.50    5   4.00
    2   3.65    5   4.00
    3   4.00    5   4.00
    4   3.85    5   4.00
    5   4.00    5   4.00
    6   3.65    5   4.00
    1   3.50    6   3.65
    2   3.65    6   3.65
    3   4.00    6   3.65
    4   3.85    6   3.65
    5   4.00    6   3.65
    6   3.65    6   3.65

    可以看到联表查询不加条件产生"笛卡尔积"后的结果是36条记录
    相当于score(成绩)的6条记录每条之间都列了出来

  2. 进行上面结果的筛选
    SELECT*
    FROMscores a,scores b
    WHEREb.score >= a.score 

    多加了一个where条件,结果如下:

    id   score   id(1)   score(1)
    1   3.50    1   3.50
    1   3.50    2   3.65
    2   3.65    2   3.65
    6   3.65    2   3.65
    1   3.50    3   4.00
    2   3.65    3   4.00
    3   4.00    3   4.00
    4   3.85    3   4.00
    5   4.00    3   4.00
    6   3.65    3   4.00
    1   3.50    4   3.85
    2   3.65    4   3.85
    4   3.85    4   3.85
    6   3.65    4   3.85
    1   3.50    5   4.00
    2   3.65    5   4.00
    3   4.00    5   4.00
    4   3.85    5   4.00
    5   4.00    5   4.00
    6   3.65    5   4.00
    1   3.50    6   3.65
    2   3.65    6   3.65
    6   3.65    6   3.65

    以上结果把"b表"的成绩(score) 大于 "a表"的成绩的记录都筛选出来记录数是23条
    此时score(1)的字段全部都是大于等于score字段的

  3. 根据以上结果我们在加一个排序

    SELECT*
    FROMscores a,scores b
    WHEREb.score >= a.score
    ORDER BY a.id

    得到结果:

    id   score   id(1)   score(1)
    1   3.50    6   3.65
    1   3.50    4   3.85
    1   3.50    1   3.50
    1   3.50    2   3.65
    1   3.50    5   4.00
    1   3.50    3   4.00
    2   3.65    6   3.65
    2   3.65    4   3.85
    2   3.65    2   3.65
    2   3.65    5   4.00
    2   3.65    3   4.00
    3   4.00    5   4.00
    3   4.00    3   4.00
    4   3.85    4   3.85
    4   3.85    5   4.00
    4   3.85    3   4.00
    5   4.00    5   4.00
    5   4.00    3   4.00
    6   3.65    6   3.65
    6   3.65    4   3.85
    6   3.65    2   3.65
    6   3.65    5   4.00
    6   3.65    3   4.00

    可以看到 id为1 成绩3.50的 大于他的有6条记录, id为2 成绩3.65的 大于他的有5条记录, 以此类推把6个成绩都想象出来

  4. 最后我们根据id分组(GROUP BY), 再把"b表"的成绩去重(DISTINCT)再记总数(COUNT)

    SELECTa.id,a.score AS Score,COUNT( DISTINCT b.score ) AS Rank
    FROMscores a,scores b
    WHEREb.score >= a.score
    GROUP BYa.id

    此sql不太好理解的就是" COUNT( DISTINCT b.score ) AS Rank  "这段
    结合步骤3(也就是上面的)结果 举例一个来理解这句sql:
    id为1 成绩3.50的 大于他的有6条记录, 分别是 3.65, 3.85, 3.50, 3.65, 4.00, 4.00
    我们看到这6条记录去掉重复后剩下 3.65, 3.85, 3.50, 4.00 这4个, 也就说明成绩 3.50有4个大于等于他的,那么最高只能排名第4
    这就是上面去重求和的作用, 求的和就是他的最高排名

  5. 补充上完整的sql

    SELECTa.id,a.score AS Score,COUNT( DISTINCT b.score ) AS Rank
    FROMscores a,scores b
    WHEREb.score >= a.score
    GROUP BYa.id
    ORDER BYa.score DESC

    结果:

    id  Score   Rank
    3   4.00    1
    5   4.00    1
    4   3.85    2
    2   3.65    3
    6   3.65    3
    1   3.50    4

    菜鸟分享, 大佬勿喷

一条sql语句查询成绩排名相关推荐

  1. 面试高频,一条sql语句查询成绩,显示'优秀' ,'及格' ,'不及格'

    有一张表,里面有3个字段:语文,数学,英语.其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来: 按照要求查询后显示 话不多说 , 直接上 ...

  2. 用一条SQL语句查询出每门课程的成绩都大于80的学生姓名

    -- 用一条SQL语句查询出每门课程的成绩都大于80的学生姓名.Student表如下: -- name course score -- 张三 语文 81 -- 张三 数学 75 -- 李四 语文 76 ...

  3. MySQL一条SQL语句查询多个科目的成绩

    MySQL一条SQL语句查询多个科目的成绩 SELECT pn.name,c.`cname`,SUM(CASE WHEN ps.coid='1' THEN sname END )AS 'domain' ...

  4. 一条SQL语句查询数据库中的所有表、存储过程、触发器

    一条SQL语句查询数据库中的所有表.存储过程.触发器 (sysobjects表信息)   该条语句查询返回所有的用户表 select * from sysobjects where xtype='u' ...

  5. 案例:用一条 SQL 语句查询出每门课都大于 80 分的学生姓名

    用一条sql语句查询出每门课都大于80分的学生姓名 首先需要进行分析: 要查询出每门课程都大于80分的学生姓名,因为一个学生有多门课程,所以会出现下面三种情况. 第一可能所有课程都大于80分. 第二可 ...

  6. 数据库:一条sql语句查询每门课程都大于80分的学生姓名

    描述:已知student表有姓名-name,分数-grade,课程-course,它们多对多对多,一条sql语句查询每门课程都大于80分的学生姓名? 分析: ①每门课程,涉及到课程数量统计 SELEC ...

  7. select每门可说大于90分_用一条sql语句查询出“每门”课程都大于80分的学生姓名...

    展开全部 首先需要进行分析: 要查询出每门课程都大于80分的学生姓名,因为一个学生有多门课程,所以会出62616964757a686964616fe78988e69d8331333366306534现 ...

  8. 一条SQL语句查询所有任务分数都在60以上的用户名字

    一条SQL语句查询所有任务分数都在60以上的用户名字 昨天面试一家公司的笔试题,有两道SQL语句查询错误,回到家进行再想想思路,做一个记录 有两张表:数据是假设的,不是真实的 用户表(user) 任务 ...

  9. 用一条SQL语句查询出每门课都大于80分的学生姓名

    两道sql题: 1.用一条SQL语句查询出每门课都大于80分的学生姓名. 2.删除除了自动编号不同,其他都相同的学生冗余信息. 第一题数据如下: 分析:每门课都大于80分,就是说学生最低分数要大于80 ...

最新文章

  1. 烂片《信条》?有多少人假装看懂了?
  2. 配置LYNC和Exchange 2010 SP1 OWA集成
  3. Ktor 1.0发布:JetBrains推出的Kotlin Web框架
  4. linux通用中断子系统介绍
  5. insightface和facenet效果+性能比较
  6. 十进制数转换为二进制数
  7. ReactNative(API)Alert
  8. 转载:Apache commons开源工具简介
  9. VMware配置网络,主机互通,可上网
  10. JAVA之outofmemory
  11. (八)Hibernate的一对多关联关系
  12. 分页存储过程--From:桌面备份 - sql2005新功能.docx
  13. 机器学习十大经典算法——随机森林
  14. 2. main函数和启动例程
  15. Redefinition of typedef is a C11 feature
  16. 7-86 分支结构——大小写字母判断
  17. 查看服务器ip修改记录,如果查看服务器ip地址和修改ip
  18. 基于JavaEE大学生二手交易平台
  19. 攻防世界forgot
  20. ubuntu apt安装java_Ubuntu 16.04 apt方式安装JDK并且配置Java开发环境详解

热门文章

  1. ps昏暗室内照片调成暖色光亮效果
  2. 怎样查看Office2010的安装位置
  3. React性能优化(完整版)
  4. Linux下zip压缩的解压
  5. 缓存穿透、缓存击穿、缓存雪崩的理解和解决方案
  6. 4.四角开关内部结构
  7. Java Thread的使用类
  8. 通过代码来申请CA证书 -- cnblog
  9. dotnet core源码地址
  10. 学习笔记 --- 工厂、单体、适配器、策略、观察者、MVC设计模式及ASP.NET MVC开发模式、关闭缓存的方法...