mysql
/*
* sql:可以是单表的查询语句,也可以是多表的联合查询语句
* firstIndex:其实的索引
* pageSize:每页显示的记录数
*/
select o.* from (sql) o limit firstIndex,pageSize
/**
*选择21-60的数据
**/
例如:select o.* from (select * from user) o limit 20,40
sqlserver
/*
* firstIndex:起始索引
* pageSize:每页显示的数量
* orderColumn:排序的字段名
* sql:可以是简单的单表查询语句,也可以是复杂的多表联合查询语句
*/
select top pageSize o.* from (select row_number() over(order by orderColumn) as rownumber,* from(sql) as o where rownumber>firstIndex;
oracle
/*
*oracle的分页查询方法相对来说要多点,ROWNUM、row_number(),今天主要将两种效率稍好的分页查询语句。
* firstIndex:起始索引
* pageSize:每页显示的数量
* sql:可以是简单的单表查询语句,也可以是复杂的多表联合查询语句
*/
①ROWNUM查询分页通式:
select * from(select a.*,ROWNUM rn from(sql) a where ROWNUM<=(firstIndex+pageSize)) where rn>firstIndex
例如:select * from (select a.*,ROWNUM rn from(select * from user) a where ROWNUM<20) where rn>0
SELECT * FROM (SELECT ROWNUM AS rowno, t.* FROM DONORINFO t WHERE ROWNUM <= page*size) table_alias WHERE table_alias.rowno > (page-1)*size;
如果需要使用order by必须先执行排序,如下:
SELECT * FROM (SELECT ROWNUM AS rowno, t.* FROM (select * from DONORINFO order by t.id) t WHERE ROWNUM <= page*size) table_alias WHERE table_alias.rowno > (page-1)*size;
②row_number()解析函数分页查询通式:
/*
* firstIndex:起始索引
* pageSize:每页显示的数量
* partition by 分组
* order by 排序
* 当以上两个关键字出现的时候,先分组,后编号排序
* orderColumn:排序的字段名
* sql:可以是简单的单表查询语句,也可以是复杂的多表联合查询语句
*/
select * from(select * from(select t.*,row_number() over(order by orderColumn) as rownumber from(sql) t) p where p.rownumber>firstIndex) where rownum<=pageSize
SELECT xx.* FROM( SELECT t.*,row_number() over(ORDER BY o_id)AS num FROM t_order t )xx WHERE num BETWEEN 5 AND 15; --返回第5-15行数据 效率比前者低
注意:
1、ROWNUM
rownum总是从1开始的,第一条不满足去掉的话,第二条的rownum 又成了1。依此类推,所以永远没有不满足条件的记录。
可以这样理解:rownum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。
它取得第一条记录则rownum值为1,第二条为2。依次类推。
当使用“>、>=、=、between...and”这些条件时,从缓冲区或数据文件中得到的第一条记录的rownum为1,不符合sql语句的条件,会被删除,接着取下条。
下条的rownum还会是1,又被删除,依次类推,便没有了数据。
所以上限条件必须放在子查询,而下限条件必须放在外层查询。