SQL

rownum 和 分页

rownum
  • ROWNUM:表示行号,实际上此是一个列,但是这个列是一个伪列,此列可以在每张表中出现。

  • 范例:查询 emp 表带有 rownum 列

  • 示例图:
    oracle(30)_SQL_rownum 和 分页_oracle

  • 可以根据 rownum 来取结果集的前几行,比如前 5行

  • 示例图:
    oracle(30)_SQL_rownum 和 分页_SQL_02

  • 但是我们不能取到中间几行,因为 rownum 不支持大于号,只支持小于号,如果想实现我们的需求怎么办呢?答案是使用子查询,也正是 oracle 分页的做法。

分页
  • 示例图:
    oracle(30)_SQL_rownum 和 分页_结果集_03
  • 起始行号的计算方法
    oracle(30)_SQL_rownum 和 分页_分页_04

以上操作完整源码:

--查询 emp 表带有 rownum 列
select rownum, t.* from emp t;

--查询 emp 表带有 rownu<6 的列
select rownum, t.* from emp t where rownum < 6;

--rownum 不支持大于号,所以下面的这种分页方式是错误的
select rownum, t.* from emp t where rownum > 5 and rownum < 11;



--分页步骤

--第一步查询全量的数据
select * from emp;

--第二步以第一步的结果集作为一张表,限定条件是 rownum 小于结束行号, 结果列把 rownum 作为结果集
select rownum rw, a.* from (select * from emp) a where rownum < 6;

--第三步以第二步的结果集作为一张表,限定条件是第二步的 rownum 列大于开始行号,结果列是 *
select *
  from (select rownum rw, a.*
          from (
                
                select * from emp
                
                ) a
         where rownum < 11) b
 where b.rw > 5;

如有错误,欢迎指正!