Oracle数据库中分页排序

本文详细介绍了Oracle数据库中实现分页及排序的方法,并通过实例演示了如何正确地结合使用rownum与orderby语句来实现分页排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

查询到的数据为:
第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) 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的值并不会变化.如果要分页排序,需要多嵌套一层查询语句.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值