不同数据库的分页技术

针对不同的数据库,分页的实现方法是不一样的。
Oracle分页技术
Oracle数据库为我们提供了两个很重要的字段:RowId和RowNumber。RowId是一个绝对的值,是针对某一行分配的一个唯一的行标识符,根据它我们可以非常迅捷地定位到某一个具体的行。它也起着主键的作用,即它是唯一的(Unique)、必有的(Mandatory)字段。RowNumber是一个相对的值,是指查询结果的行号。例如Standard标准题录表中有三条题录信息,那么每行对应的RowNumber即为1、2、3。它是一个从1开始标记的行数信息。根据RowNumber,我们就可以实现分页技术了。
但是在实施的过程中,也遇到了一个问题。最开始我认为这样写就可以了:
select * from thetable
where rownumber between ((页码-1) * 页容量 + 1) and (页码 * 页容量)
例如如果10条一页,取第二页的内容,那么就是:select * from thetable where rownumber between (2-1)*10+1 and 2*10。但这是错误的,返回结果会是一个空集合。对rownumber实施where条件查询是有限制的,只能求前多少多少行,即where rownumber<somevalue。所以只能让rownumber小于某一值,不能求中间的某一个值域。
虽然RowNumber不能按照上述的方法使用,但是依然存在别的方法来分页。如果我们求100-200行的记录,需要使用两层select语句。内层只需要先select出前100行的rowid,以便于从前200行中排除;外层select要做两件事情,一是求出前200行数据,二是排除前100行数据。这样,分页技术便实现了。
经过改造,在Oracle下分页的sql语句如下:
select * from thetable
where rowid not in(
select rowid from thetable where rownum<=(页码-1)*页容量
) and rowid in(select rowid from thetable where rownum<=页码*页容量)


SqlServer分页技术
SQLServer的分页方法和Oracle不尽相同。SQLServer并没有提供Oracle特有的RowId和Rownumber两个字段,而是使用了top这个关键字:select top 10 * from thetable或是select top (10) * from thetable。SQLServer2000使用前者不加括号的书写方法,SQLServer2005开始支持括号,增加可读性。通过top关键字,可以限制查询只取得结果集的前多少行。这个等价于Oracle的where rownumber<somevalue,也同样可以实现分页技术。所以在SQLServer下的分页sql语句写法如下:
select top 页容量 * from thetable where id>(
select max (id) from(
    select top ((页码-1)*页容量) id from table1 order by id
)
)
order by id


MySql分页技术
MySql数据库的分页技术实现起来要比前两种数据库简单一些。由于加入了关键字limit,分页在MySql下面显得非常简单。语句如下:
select * from thetable limit (页码-1)*页容量 , 页码*页容量
limit关键字是个index,即起始值从0开始。

阅读更多
想对作者说点什么? 我来说一句

Java web 分页技术

2012年12月16日 465KB 下载

MySql分页技术

2012年12月12日 11KB 下载

JSP分页技术的实现

2008年11月06日 3KB 下载

高效的MySQL分页

2010年04月26日 5KB 下载

jsp 分页技术的实现

2009年03月24日 2KB 下载

没有更多推荐了,返回首页

不良信息举报

不同数据库的分页技术

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭