oracle之分页查询

背景

oracle数据库中没有limit关键词,相对来说oracle的分页就会比较麻烦一点。

需要用到ROWNUM来计算了。

分页方法

由于在oracle查询中涉及到条件,所以需要多重的where查询。主要思路如下:

  • 使用普通条件筛选出全量的所需的结果集A
  • 对结果A进行查询,增加ROWNUM字段,生成结果集B
  • 对结果集B,通过ROWNUM进行where子查询

实现如下:

1
2
3
4
5
6
7
8
9
10
select * 
from (
select ROWNUM NO,
A.*
from (
select * from table_x
where ...
) A
)B
where NO > startnum and NO < endnum

优化

针对上面的查询,可以在第二步子查询的时候,先增加NO < endnum条件,缩小结果集B的范围。

结果如下:

1
2
3
4
5
6
7
8
9
10
11
select * 
from (
select ROWNUM NO,
A.*
from (
select * from table_x
where ...
) A
where ROWNUM < endnum
)B
where NO > startnum

扩展

相对的mysql就比较简单,直接用limit即可:

1
select * from table_x limit startnum, endnum