Oracle分页查询对照

2021-06-25  本文已影响0人  CokeCode

Oracle12c以前的分页,使用rownum关键字,rownum不支持大于号,因此,

select g.* from grade g where rownum <= 10 order by chinese;
select MyGrade.* 
    from (
        select G.*, rownum rn 
            from (
                select g.* from grade g order by chinese
            ) G 
    ) MyGrade
    where MyGrade.rn > 10;

注意rownum不支持大于号,因此select g.* from grade g where rownum > 10 order by chinese;是错误的,ROWNUM是一个序列,会根据sql语句自动给你加上一列排好顺序的序号列。rownum总是为满足条件的记录从1开始设序号,所以rownum总是从1开始的。这理解起来并没有问题。当从数据库中找到语文成绩第一名的记录时,设序号为1,该记录不满足rownum>10。所以抛弃该记录,接着从数据库中找到语文成绩第二名的记录,又设序号为1,该记录依然不满足rownum>10,依次类推。所以穷尽整张表抛弃了所有记录。

如果想要限定查询的上下界,如:

select MyGrade.*
    from (
        select G.*, rownum rn
            from (
                select g.* from grade g order by chinese
            ) G
            where rownum <= 10
    ) MyGrade
    where MyGrade.rn >= 6;

所以Oracle 12c以前的分页查询,想要表达 大于/大于等于 某些行的条件,必须在最外层进行 大于/大于等于 条件判断,rownum不支持大于号。

Oracle 12c后引入了新的分页语法:

SELECT * FROM grade order by chinese fetch first 10 rows only;
SELECT * FROM grade order by chinese offset 5 rows fetch next 5 rows only;
SELECT * FROM grade order by chinese fetch first 1 percent rows only;
上一篇下一篇

猜你喜欢

热点阅读