Oracle数据库中分页排序

xiaoxiao2021-02-28  87

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) tmp where tmp.rn >5;

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

排序

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

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

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

结果是:

分页排序

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

select tmp.* from (select h.*,rownum rn from house_info h where rownum <= 10 order by area desc) tmp where 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 )temp where temp.rn >5 and temp.rn <=10;

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

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

转载请注明原文地址: https://www.6miu.com/read-49331.html

最新回复(0)