SQL中分组函数的使用及前N条记录的查询方法
来源:互联网 发布:网站特效js代码 编辑:程序博客网 时间:2024/05/01 22:20
SQL中分组函数的使用及前N条记录的查询方法
在面试的时候我经常会给毕业生出这样一道SQL题:
有一张表studentgrade,包含三个字段name,subject和grade,如下所示:
name subject grade
a 数学 99
b 英语 67
a 英语 77
题目要求应试者写出sql,查询每个人的最高分和最高分的科目,比如
a 数学 99
下面分析这个SQL的查询方法,分组函数是最常使用的,下面的分组函数可以得到最高分,姓名
select name,max(grade) from studentgrade group by name;
这样显然得不到具体的科目,要得到科目怎么办呢?使用临时表就是一个方案:
select b.name,b.grade,b.subject from
(select name, max(grade) grade from studentgrade group by name ) a,
studentgrade b
where a.name = b.name and a.grade = b.grade;
如果是需要查询每个人前三个最高分的成绩和科目呢?分组函数ms就无能为力了。下面是是几个不错的方式:
1、对每条记录进行检验,查询这条记录是不是排在前三位的
select a.* from studentgrade a where 3 > (select count(*) from studentgrade where name=a.name and grade< a.grade) order by a.name,a.grade;
为提高查询效率,在name和grade上面建立联合索引。
2、先把每个同学最大的三个科目分数查询出来形成一个集合,然后对每条记录进行检验,查看是否在这个集合里面。这种方式是mysql特有的,使用了top关键字。
select a.* from studentgrade a where grade in (select top 3 grade from studentgrade where name=a.name order by grade) order by a.name,a.grade;
3、和第一种方式差不多,但使用的exists关键字。
select a.* from studentgrade a where exists (select count(*) from studentgrade where name=a.name and grade<a.grade having Count(*) < 2) order by a.name;
有一张表studentgrade,包含三个字段name,subject和grade,如下所示:
name subject grade
a 数学 99
b 英语 67
a 英语 77
题目要求应试者写出sql,查询每个人的最高分和最高分的科目,比如
a 数学 99
下面分析这个SQL的查询方法,分组函数是最常使用的,下面的分组函数可以得到最高分,姓名
select name,max(grade) from studentgrade group by name;
这样显然得不到具体的科目,要得到科目怎么办呢?使用临时表就是一个方案:
select b.name,b.grade,b.subject from
(select name, max(grade) grade from studentgrade group by name ) a,
studentgrade b
where a.name = b.name and a.grade = b.grade;
如果是需要查询每个人前三个最高分的成绩和科目呢?分组函数ms就无能为力了。下面是是几个不错的方式:
1、对每条记录进行检验,查询这条记录是不是排在前三位的
select a.* from studentgrade a where 3 > (select count(*) from studentgrade where name=a.name and grade< a.grade) order by a.name,a.grade;
为提高查询效率,在name和grade上面建立联合索引。
2、先把每个同学最大的三个科目分数查询出来形成一个集合,然后对每条记录进行检验,查看是否在这个集合里面。这种方式是mysql特有的,使用了top关键字。
select a.* from studentgrade a where grade in (select top 3 grade from studentgrade where name=a.name order by grade) order by a.name,a.grade;
3、和第一种方式差不多,但使用的exists关键字。
select a.* from studentgrade a where exists (select count(*) from studentgrade where name=a.name and grade<a.grade having Count(*) < 2) order by a.name;
PHP 学习QQ群:193990134
- SQL中分组函数的使用及前N条记录的查询方法
- SQL查询每个分组的前N条记录
- SQL查询每个分组的前N条记录
- SQL查询每个分组的前N条记录
- [MS SQL]SQL语句查询每个分组的前N条记录的实现方法
- orcale 查询分组后的前n条记录
- [MSSQL]语句查询每个分组的前N条记录的实现方法
- MySQL 查询分页数据中分组后取每组的前N条记录
- MySQL 查询分页数据中分组后取每组的前N条记录
- oracle中,分组后,取各组的前n条记录的sql
- SQL不同数据库下的查询前n条记录
- mysql分组排序取前N条记录的最简洁的单条sql !
- mysql分组排序取前N条记录的最简洁的单条sql
- SQL Server查询前M到N条记录的方法
- SQL Server查询前N条记录的三种方法
- SQL Server查询前N条记录的三种方法
- oracle中,分组后,取各组的前n条记录的sql语句:rownumber() over()
- oracle中,分组后,取各组的前n条记录的sql语句:rownumber() over()
- 32bit和62bit 系统各数据类型占用字节数
- Charpter 9
- 检查存储结构-控制、REDO日志、表空间使用情况、数据文件等信息脚本--HTML
- maximum.s
- 5款工具助你写出更好的Java代码
- SQL中分组函数的使用及前N条记录的查询方法
- LINK : fatal error LNK1104: cannot open file
- java抽象类
- Documentation_SecurityBugs
- Linux下http协议实现
- VC多线程篇
- yum 简介及使用 安装、删除
- 便于运维的Windows服务
- Dynamic Skin Form VCL v12.96 Full Source