数据库的限制结果集行数

上一篇 / 下一篇  2016-12-25 00:36:40 / 个人分类:数据库

在进行数据检索的时候有时候需要只检索结果集中的部分行,比如说“检索成绩排前三名的学生”、“检索工资水平排在第3位到第7位的员工信息”,这种功能被称为“限制结果集行数”。不同数据库有不同的语法。

1、MYSQL

MYSQL中提供了LIMIT关键字用来限制返回的结果集,LIMIT放在SELECT语句的最后位置,语法为“LIMIT 首行行号,要返回的结果集的最大数目”
SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5  //返回按照工资降序排列的从第二行开始(行号从0开始)的最多五条记录
SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 0,5  //返回按照工资降序排列的前五条记录

2、MSSQLServer2000

MSSQLServer2000中提供了TOP关键字用来返回结果集中的前N条记录,其语法为“SELECT TOP 限制结果集数目 字段列表 SELECT语句其余部分”
select top 5 * from T_Employee order by FSalary Desc

SELECT top 3 * FROM T_Employee
WHERE FNumber NOT IN
(SELECT TOP 5 FNumber FROM T_Employee ORDER BY FSalary DESC)
ORDER BY FSalary DESC  //检索按照工资从高到低排序检索从第六名开始一共三个人的信息(首先将前五名的主键取出来,在检索的时候检索排除了这五名员工的前三个人)

3、MSSQLServer2005

MSSQLServer2005兼容几乎所有的MSSQLServer2000的语法,所以可以使用上个小节提到的方式来在MSSQLServer2005中实现限制结果集行数,不过MSSQLServer2005提供了新的特性来帮助更好的限制结果集行数的功能,这个新特性就是窗口函数ROW_NUMBER()。
ROW_NUMBER()函数可以计算每一行数据在结果集中的行号(从1开始计数),其使用语法
如下:ROW_NUMBER OVER(排序规则) (ROW_NUMBER()不能用在WHERE语句中

SELECT ROW_NUMBER() OVER(ORDER BY FSalary),FNumber,FName,FSalary,FAge
FROM T_Employee

SELECT * FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY FSalary DESC)AS rownum,
FNumber,FName,FSalary,FAge FROM T_Employee
) AS a
WHERE a.rownum>=3 AND a.rownum<=5  //返回第3行到第5行的数据

4、Oracle

Oracle中支持窗口函数ROW_NUMBER(),其用法和MSSQLServer2005中相同,比如我们执
行下面的SQL语句:
SELECT * FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY FSalary DESC)row_num,
FNumber,FName,FSalary,FAge FROM T_Employee
) a
WHERE a.row_num>=3 AND a.row_num<=5
注意:rownum在Oracle中为保留字,所以这里将MSSQLServer2005中用到的rownum替换
为row_num;Oracle中定义表别名的时候不能使用AS关键字,所以这里也去掉**。

Oracle支持标准的函数ROW_NUMBER(),不过Oracle中提供了更方便的特性用来计算行号,
也就在Oracle中可以无需自行计算行号,Oracle为每个结果集都增加了一个默认的表示行号
的列,这个列的名称为rownum比如我们执行下面的SQL语句:
SELECT rownum,FNumber,FName,FSalary,FAge FROM T_Employee

使用rownum我们可以很轻松的取得结果集中前N条的数据行
SELECT * FROM T_Employee
WHERE rownum<=6
ORDER BY FSalary Desc  //按工资从高到底排序的前6名员工的信息

SELECT rownum,FNumber,FName,FSalary,FAge FROM T_Employee
WHERE rownum BETWEEN 3 AND 5
ORDER BY FSalary DESC  // 错误!检索结果为空!!rownum的含义:rownum为结果集中每一行的行号(从1开始计数)。当进行检索的时候,对于第一条数据,其rownum为1,因为不符合“WHERE rownumBETWEEN 3 AND 5”,所以没有被放到了检索结果中;当检索到第二条数据的时候,因为第一条数据没有放到结果集中,所以第二条数据的rownum仍然为1,而不是我们想像的2。

因此如果要使用rownum来实现“按照工资从高到低的顺序取出第三个到第五个员工信息”的功能,就必须借助于窗口函数ROW_NUMBER()。

5、DB2

DB2中支持窗口函数ROW_NUMBER(),其用法和MSSQLServer2005以及Oracle中相同,比
如我们执行下面的SQL语句
SELECT * FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY FSalary DESC) row_num,
FNumber,FName,FSalary,FAge FROM T_Employee
) a
WHERE a.row_num>=3 AND a.row_num<=5

除此之外,DB2还提供了FETCH关键字用来提取结果集的前N行,其语法为“FETCH FIRST 条数 ROWS ONLY”,比如我们执行下面的SQL语句可以得到按工资从高到底排序的前6名员工的信息:
SELECT * FROM T_Employee
ORDER BY FSalary Desc
FETCH FIRST 6 ROWS ONLY
需要注意的是FETCH子句要放到ORDER BY语句的后面

DB2没有直接提供返回提供“检索从第5行开始的10条数据,采用其他方法来变通实现,最常使用的方法就是用子查询,比如要实现检索按照工资从高到低排序检索从第六名开始一共三个人的信息,那么就可以首先将前五名的主键取出来,在检索的时候检索排除了这五名员工的前三个人。
SELECT * FROM T_Employee 
WHERE FNumber NOT IN 
SELECT FNumber FROM T_Employee 
ORDER BY FSalary DESC 
FETCH FIRST 5 ROWS ONLY
)
ORDER BY FSalary DESC
FETCH FIRST 3 ROWS ONLY  //检索从第六名开始一共三个人的信息


以上摘自《程序员的SQL 金典》

TAG: 数据库

 

评分:0

我来说两句

Open Toolbar