关于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 @pagesize …FROM 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 SELECT … 6 FROM tbl WHERE sortcolumn >= @Sort ORDER BY sortcolumn
三、Mysql
实现Top N及M至N段的记录查询
我们可以利用MySQL中提供的一个强大的关键字LIMIT来完成这项功能。
LIMIT可以实现top N查询,也可以实现M至N(某一段)的记录查询,具体语法如下:
1 SELECT … 2 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我确实不熟,可是这真心不是我想要的啊,只想问一句:为毛呢!?