Oracle分页相比较MySQL麻烦一点,但是也不复杂
首先学习分页之前需要知道一个东西,那就是ROWNUM:
ROWNUM:它是一个伪列,用来给查询返回的行编号,其实也就是行号,它是从1开始计的。
其次,非常重要的一点,ROWNUM数值起初是空的,只有在查询到的数据满足选择条件时才会赋值。什么意思呢,
举个例子:SELECT ROWNUM, ename FROM EMP WHERE ROWNUM > 5;
这句sql是查询不到数据的,why? because当查询到第一条数据时,ROWNUM还是空的,所以where条件是不满足的,所以第一条数据不符合条件,ROWNUM不会赋值为1,依然为空,以此类推,直到查询完成也没有符合条件的数据,最后返回空。
所以,在Oracle分页时,需要先给数据编号,即先查ROWNUM,然后把查询到的数据当作一张表(即写在from子句中),再用需要查询的数据的ROWNUM的范围再查询一次即可。
因此:Oracle分页需要两步:
1.编号
2.取数据
例:
SELECT * FROM (SELECT ROWNUM r, column1, column2, ... FROM table) WHERE r >= start AND r <= size
或者:
SELECT * FROM (SELECT ROWNUM r, column1, column2, ... FROM table) WHERE r BETWEEN start AND size
但是,有时候我们在分页查询的时候可能有新的数据插入,所以可能导致第一页之后的查询出现重复的列,所以一般在分页之前我们会加上一步排序,防止数据重复:
例:SELECT * FROM ( --取数据
SELECT ROWNUM r, t.* FROM ( --编号
SELECT column1, column2, ... FROM table ORDER BY column --排序
) t
) WHERE r BETWEEN start AND end;
最后再介绍一下分页的两个小算法:
page:页数
pageSize:每页显示的行数
start=(page - 1) * pageSize + 1
由于在Hibernate框架中,数据下标从0开始,所以start=(page - 1) * pageSize