Oracle分页查询对照

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

  • 查询语文成绩前十名的学生成绩信息:
select g.* from grade g where rownum <= 10 order by chinese;
  • 查询语文成绩10名以后的学生成绩信息:
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,依次类推。所以穷尽整张表抛弃了所有记录。

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

  • 查询语文成绩6 - 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;
  • 查询语文成绩6 - 10名的学生成绩信息:
SELECT * FROM grade order by chinese offset 5 rows fetch next 5 rows only;
  • 查询语文成绩前1%的学生成绩信息:
SELECT * FROM grade order by chinese fetch first 1 percent rows only;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容