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