关于Oracle、MySQL、SqlServer三个库的分页SQL的小总结

一、概述
本文主要是针对日常系统开发中的数据分页方式方法进行总结,按照数据库类别,分为Mysql、SQL Server和Oracle三部分,由于知识结构所限,可能总结的方法都不是太深入,只是简单的应用型的方法,对于这些方法的内部逻辑和性能评测,则不是很明确。

二、SQL Server 有三种方法可以实现:

  1、这种方法可能是实际应用中使用最多的,在轻量级的开发中,它的性能弊端也不是太明显,称之为Sub-Query:

   语句:

1 select top @ pagesize * from(select top (@pageindex+1)*@pagesize * from tbl order by condition) as tbl2 order by tb2.condition desc

  2、这是至少要在SQL Server 2005sp2往上的版本才有的一个方法,ROW_NUMBER()
     语句:

1 WITH ListOrder AS
2 (SELECT A.*,ROW_NUMBER() OVER (ORDER BY A.sortcolumn) AS RowNumber FROM tbl A )
3 SELECT DISTINCT TOP @pagesizeFROM ListOrder WHERE RowNumber > @pagesize*@pageindex

  3、这一条则是利用了另外一个方法,RowCount
   语句:

1 DECLARE @Sort int/* the type of the sorting column */
2 SET ROWCOUNT @startrow
3 SELECT @Sort = sortcolumn FROM tbl ORDER BY sortcolumn
4 SET ROWCOUNT @pagesize
5 SELECT6 FROM tbl WHERE sortcolumn >= @Sort ORDER BY sortcolumn

三、Mysql
  实现Top N及M至N段的记录查询
  我们可以利用MySQL中提供的一个强大的关键字LIMIT来完成这项功能。
  LIMIT可以实现top N查询,也可以实现M至N(某一段)的记录查询,具体语法如下:

1 SELECT2 FROM tbl ORDER BY sortcolumn LIMIT offset, pagesize

四、Oracle
  相较而言Oracle提供了另外一个强大的方法 Rownum,可以直接取得从startrow到endrow的所有行,语法如下:

1 SELECT * from table  where ROWNUM < (pagesize*pageindex + 1)
2 MINUS 
3 SELECT * FROM  table  where ROWNUM < ((pagesize*pageindex + 1)- pagesize)

  如果有各种事先的子查询以及分组、排序之类的需要的话,可以这样:

1 SELECT* from (SELECT * FROM table WHERE filters ORDER BY sortcolumn ASC)  where ROWNUM < (pagesize*pageindex+1)
2 MINUS 
3 SELECT * FROM  (SELECT * FROM table WHERE filters ORDER BY sortcolumn ASC)  where ROWNUM < ((pagesize*pageindex+1)-pagesize)

  其实我属意的方式应该是这样:

1 WITH LISTORDER AS  (SELECT * FROM table WHERE filters ORDER BY sortcolumn ASC)
2 SELECT* from LISTORDER where ROWNUM < (pagesize*pageindex+1)
3 MINUS 
4 SELECT * FROM LISTORDER where ROWNUM < ((pagesize*pageindex+1)-pagesize)

  可是现实给我我巨大的打击...后一种方式取得的数据不但数量会多一条,而且更关键的是...跟前面的语句取得的数据完全不一样;

  好吧,我承认,对于ORACLE我确实不熟,可是这真心不是我想要的啊,只想问一句:为毛呢!?

posted @ 2012-09-07 10:45  Andomiel  阅读(535)  评论(3)    收藏  举报