Oracle分页

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 

你可能感兴趣的:(Oracle)