一条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
分步骤理解(sql拆解理解):
前提:要简单理解sql执行顺序, 和"笛卡尔积"的概念
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条记录每条之间都列了出来- 进行上面结果的筛选
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字段的 根据以上结果我们在加一个排序
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个成绩都想象出来
最后我们根据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
这就是上面去重求和的作用, 求的和就是他的最高排名补充上完整的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语句查询成绩排名相关推荐
- 面试高频,一条sql语句查询成绩,显示'优秀' ,'及格' ,'不及格'
有一张表,里面有3个字段:语文,数学,英语.其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来: 按照要求查询后显示 话不多说 , 直接上 ...
- 用一条SQL语句查询出每门课程的成绩都大于80的学生姓名
-- 用一条SQL语句查询出每门课程的成绩都大于80的学生姓名.Student表如下: -- name course score -- 张三 语文 81 -- 张三 数学 75 -- 李四 语文 76 ...
- MySQL一条SQL语句查询多个科目的成绩
MySQL一条SQL语句查询多个科目的成绩 SELECT pn.name,c.`cname`,SUM(CASE WHEN ps.coid='1' THEN sname END )AS 'domain' ...
- 一条SQL语句查询数据库中的所有表、存储过程、触发器
一条SQL语句查询数据库中的所有表.存储过程.触发器 (sysobjects表信息) 该条语句查询返回所有的用户表 select * from sysobjects where xtype='u' ...
- 案例:用一条 SQL 语句查询出每门课都大于 80 分的学生姓名
用一条sql语句查询出每门课都大于80分的学生姓名 首先需要进行分析: 要查询出每门课程都大于80分的学生姓名,因为一个学生有多门课程,所以会出现下面三种情况. 第一可能所有课程都大于80分. 第二可 ...
- 数据库:一条sql语句查询每门课程都大于80分的学生姓名
描述:已知student表有姓名-name,分数-grade,课程-course,它们多对多对多,一条sql语句查询每门课程都大于80分的学生姓名? 分析: ①每门课程,涉及到课程数量统计 SELEC ...
- select每门可说大于90分_用一条sql语句查询出“每门”课程都大于80分的学生姓名...
展开全部 首先需要进行分析: 要查询出每门课程都大于80分的学生姓名,因为一个学生有多门课程,所以会出62616964757a686964616fe78988e69d8331333366306534现 ...
- 一条SQL语句查询所有任务分数都在60以上的用户名字
一条SQL语句查询所有任务分数都在60以上的用户名字 昨天面试一家公司的笔试题,有两道SQL语句查询错误,回到家进行再想想思路,做一个记录 有两张表:数据是假设的,不是真实的 用户表(user) 任务 ...
- 用一条SQL语句查询出每门课都大于80分的学生姓名
两道sql题: 1.用一条SQL语句查询出每门课都大于80分的学生姓名. 2.删除除了自动编号不同,其他都相同的学生冗余信息. 第一题数据如下: 分析:每门课都大于80分,就是说学生最低分数要大于80 ...
最新文章
- 烂片《信条》?有多少人假装看懂了?
- 配置LYNC和Exchange 2010 SP1 OWA集成
- Ktor 1.0发布:JetBrains推出的Kotlin Web框架
- linux通用中断子系统介绍
- insightface和facenet效果+性能比较
- 十进制数转换为二进制数
- ReactNative(API)Alert
- 转载:Apache commons开源工具简介
- VMware配置网络,主机互通,可上网
- JAVA之outofmemory
- (八)Hibernate的一对多关联关系
- 分页存储过程--From:桌面备份 - sql2005新功能.docx
- 机器学习十大经典算法——随机森林
- 2. main函数和启动例程
- Redefinition of typedef is a C11 feature
- 7-86 分支结构——大小写字母判断
- 查看服务器ip修改记录,如果查看服务器ip地址和修改ip
- 基于JavaEE大学生二手交易平台
- 攻防世界forgot
- ubuntu apt安装java_Ubuntu 16.04 apt方式安装JDK并且配置Java开发环境详解