Oracle数据库中分页排序

来源:互联网 发布:济南浪潮java工资待遇 编辑:程序博客网 时间:2024/05/29 10:15

Oracle分页的实现

Oracle中分页是使用rownum实现的,可以根据页数和每页条数限制rownum的取值范围.

house_info表信息

有下面一个表,表名是house_info,表结构如下:
表结构

分页

计算rownum的取值范围

rownum的取值范围跟页数和每页条数有关,同时也跟SQL语句中运算符有关.

假设每页条数pagesize为5,取第2页的数据,则rownum的取值范围为:
startIndex=(2-1)*5;
endIndex=2*5;

实现分页

select tmp.* from    (select h.*,rownum rn from house_info h where rownum <= 10) tmpwhere tmp.rn >5;

查询到的数据为:
第2页分页数据
其中,第一列是查询到的rownum的值,最后一列是子查询中rownum的值.

排序

如果是单纯的排序可以用order by来实现,且默认排序规则为asc升序,可以使用desc来设置排序规则为降序.

假设我们要按照房屋面积降序排列,我们可以这么写:

select h.* from house_info h order by area desc;

结果是:
面积最大的10条信息

分页排序

假设我们要得到按照面积area降序排序之后第2页的房屋信息,我们该怎么写?
我们也许会这么写:

select tmp.* from    (select h.*,rownum rn from house_info h where rownum <= 10 order by area desc) tmpwhere tmp.rn >5;

但是,这样的结果是:

面积降序错误示范

这跟我们的预期不一样,我们预期的数据是:

预期数据

为什么会出现这样的情况?

分页排序这里有一个注意事项,就是order by 之后,并不改变查询到的数据的rownum的值.

所以,这么写我们得到的是先查询到第2页的数据,接着对第2页的数据进行排序.

而我们需要做的是先对数据进行排序,然后得到第2页的数据.
那么我们就要对语句进行更改:

select temp.* from     (select tmp.*,rownum rn from        (select h.* from house_info h order by area desc) tmp    )tempwhere temp.rn >5 and temp.rn <=10;

正确分页数据
这样得到的数据才是正确的数据.

总结:
注意在Oracle数据库中,使用order by 语句时,rownum的值并不会变化.如果要分页排序,需要多嵌套一层查询语句.

原创粉丝点击