在 csdn 上看到的一个例子,很多记录中以某个字段为中心最前面的两条数据

--给个例子参考

--查询每门课程的前2名成绩

CREATE TABLE StudentGrade(

stuId CHAR(4),    --学号

subId INT,        --课程号

grade INT,        --成绩

PRIMARY KEY (stuId,subId)

)

GO

--表中数据如下

INSERT INTO StudentGrade(stuId,subId,grade) VALUES('001',1,97);

INSERT INTO StudentGrade(stuId,subId,grade) VALUES('001',2,50);

INSERT INTO StudentGrade(stuId,subId,grade) VALUES('001',3,70);

INSERT INTO StudentGrade(stuId,subId,grade) VALUES('002',1,92);

INSERT INTO StudentGrade(stuId,subId,grade) VALUES('002',2,80);

INSERT INTO StudentGrade(stuId,subId,grade) VALUES('002',3,30);

INSERT INTO StudentGrade(stuId,subId,grade) VALUES('003',1,93);

INSERT INTO StudentGrade(stuId,subId,grade) VALUES('003',2,95);

INSERT INTO StudentGrade(stuId,subId,grade) VALUES('003',3,85);

INSERT INTO StudentGrade(stuId,subId,grade) VALUES('004',1,73);

INSERT INTO StudentGrade(stuId,subId,grade) VALUES('004',2,78);

INSERT INTO StudentGrade(stuId,subId,grade) VALUES('004',3,87);

GO

/*

要查询每门课程的前2名成绩

001 1 97

003 1 93

003 2 95

002 2 80

004 3 87

003 3 85

如何实现?

*/

--查看数据

select * from StudentGrade

--假如出现并列时,也只取两个同学的话。

--方法一:

select distinct *

from studentgrade as t1

where stuid in

(select top 2 stuid

from studentgrade as t2

where t1.subid=t2.subid

order by t2.grade desc)

order by subid, grade desc

--方法二:

select * from StudentGrade a where (select count(1) from studentGrade where subId=a.subId and grade>=a.grade)<=2

--方法三:

select * from StudentGrade t

where (select count(1) from StudentGrade where subid=t.subid and grade>t.grade)<=1

order by subId,grade desc

--结果

/*

stuId subId       grade

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

001   1           97

003   1           93

003   2           95

002   2           80

004   3           87

003   3           85

(6 row(s) affected)

*/

共有三种方案,从难易程度上讲我倾向于后两种,从查询逻辑思想上来讲后两种是一样的

select * from StudentGrade t

where (select count(1) from StudentGrade where subid=t.subid and grade>t.grade)<=1

order by subId,grade desc

mysql内表和外表_内表查询用到外表相关推荐

  1. 【MySQL笔记 第06章_多表查询】

    第06章_多表查询 多表查询概述 1.一个案例引发的多表连接 1.1 案例说明 1.2 笛卡尔积(或交叉连接)的理解 演示代码 2. 多表查询分类讲解 分类1:等值连接 vs 非等值连接 等值连接 非 ...

  2. mysql的表面sno大全_学生表学号sno数据库

    Microsoft SQL Server 2005习题汇总小结 先建student ,course,sc表: CREATE TABLE Student ( Sno     char(7)   PRIM ...

  3. mysql数据库视图重命名_数据表和视图:修改数据表

    在MySQL中,ALTER 语句用来修改数据表名称或者数据表字段名称.也可以用来添加或者删除数据表字段. ALTER 语句经常和"ADD", "DROP" an ...

  4. mysql连表删除语句_两表联合查询的sql删除语句的写法(连表删除)

    DELETE删除多表数据,怎样才能同时删除多个关联表的数据呢?这里做了深入的解释: 1 delete from t1 where 条件 2 delete t1 from t1 where 条件 3 d ...

  5. mysql判断视图是否存在_使用JDBC查询是否存在某表或视图,按月动态生成表

    查询数据库是否有某表的存在,主要用的就是Connection对象对元数据的操作,代码很简单,贴出来大家参考 /** * 查询数据库是否有某表 * @param cnn * @param tableNa ...

  6. java mysql 表关系分析_数据库表的关系

    表与表之间一般存在三种关系,即一对一,一对多,多对多关系. 下面分别就三种关系讲解数据库相关设计的思路和思考过程: (1)一对一关系 例如,下面的一张表,保存了人的相关信息,有男有女,要求查处所有的夫 ...

  7. sql 两表数据合并_多表查询SQL语句

    本篇文章中主要讲述以下内容: 一.表的加法 合并两张表的过程: 然后运用sql语句: select 课程号,课程名称 from course union select 课程号,课程名称 from co ...

  8. java 顺序表的实现_顺序表的简单实现(Java)

    采用Java实现数据结构中的顺序表 /** *Apr 15, 2013 *Copyright(c)JackWang *All rights reserve *@Author JackWang */ p ...

  9. mysql清空表分区数据恢复_清空表数据恢复 mysql恢复某个表数据

    excel表格删除后如何恢复? 谢邀,如果是删除时间很短且只是删除内容,可以使用撤回.如果是整个文件删除,回收站没有,可以使用数据恢复软件恢复. excel数据清空保存了,怎么恢复原数据? 1.首先在 ...

  10. mysql 查询表后三行数据库_单表千万行数据库 LIKE 搜索优化手记

    我们经常在数据库中使用 LIKE 操作符来完成对数据的模糊搜索,LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. 如果需要查找客户表中所有姓氏是"张"的数据,可以使用 ...

最新文章

  1. mysql种编译码写在哪_深入理解Java虚拟机(程序编译与代码优化)
  2. Zip文件中文乱码问题解决方法(MAC->Windows)
  3. hdu 3401(单调队列优化dp)
  4. SpringBoot_日志-SpringBoot默认配
  5. github服务器停止响应,如何解决“git pull,致命:无法访问'https://github.com ... \':服务器空回复”...
  6. js删除两个集合中共同元素_多个集合中的共同和独特元素
  7. 学考语言成绩c对高考有影响吗_三大影响!考生务必上心,最近正在进行的学考对升学很重要...
  8. html获取url后面的参数_Golang Gin 实战(四)| URL查询参数的获取和原理分析
  9. 计算机关闭的时候自动更新,win7自动更新关闭有什么影响_win7系统关闭自动更新的步骤-win7之家...
  10. codeforces 675D Tree Construction set
  11. mysql配置文件 my.ini
  12. 应用商店打开服务器错误,教你应用商店出现错误的修复方法
  13. 《STM32》F103C8T6最小系统
  14. md5和sha256算法的区别,哪个比较安全
  15. opencv2.4.9 + vc2012配置过程记录
  16. <Halcon> 区域划分算子partition_dynamic和partition_rectangle
  17. Win11如何添加默认打印机?
  18. 第一讲:最能入门的爬虫教程(Python实现)
  19. 巴菲特致股东的一封信:2001年
  20. 敏捷开发实践经验分享

热门文章

  1. 软考(网络工程师)-必备网络知识(笔记一)
  2. Java为什么要序列化
  3. 码农也来关注下经济问题美元加息对我们的影响
  4. ARM9——五级流水线结构,以及PC指针
  5. 永久域名注册流程知识
  6. Golang优秀开源项目汇总, 10大流行Go语言开源项目, golang 开源项目全集(golang/go/wiki/Projects), GitHub上优秀的Go开源项目...
  7. 程序员因接外包坐牢!两万字长文揭露心酸真实经历
  8. Firefox插件Xmarks的使用方法
  9. luogu P1338 末日的传说
  10. 如何升级 Win10 系统