ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。
为什么Oracle只能使用嵌套完成分页?
原因:先执行from生成虚拟表1,再判断虚拟表1每条记录是否符合where条件,拿出的第一条时rownum为1,判断不成立则删除,再拿出的一条数据时rownum仍是设置为1,只有符合where条件时,下一条rownum才会加1。
例如:
select * from tablename where rownum > 1; --无数据:拿出虚拟表1第一条数据时,rownum=1, where rownum > 1不成立;拿出虚拟表1第二条数据时,rownum=1, where rownum > 1不成立;如此查不到数据。
select * from tablename where rownum = 1;--有第一条数据
select * from tablename where rownum <= 5;--有前五条数据
按照这样的逻辑,所以where中rownum只能用于查询 <=、< 、=1
分页查询:
select b.* from (select a.*,rownum rn from tablename a where rownum <=5) b where rn >=3;
select b.* from (select a.*,rownum rn from tablename a) b where rn between 3 and 5;
带排序的分页查询:
注意:sql执行顺序:order by 在where之后
select * from (select rownum rn,a.* from (select * from tablename order by sal desc) a) where rn>=5 and rn <=9;
--通过分析函数row_number来分页
select * from (select row_number() over (order by sal) as rn,a.* from tablename a) b where b.rn>=5 and b.rn<=9;