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;