分页查询使用的是rownum伪列,他会根据读取的记录成成一个数字。
先来看一下rownum的基本使用:
select * from emp where rownum >= 1; -- 这个可以查询emp表的所有数据
select * from emp where rownum > 1;
select * from emp where rownum > 10;-- 这个两个查询不出来数据
-- 因为在查询数据的rownum是从1开始的
-- 即当查询第一条记录的时候rownum=1,不满足条件就舍去第一条记录
-- 在查询第二条记录的时候rownum就又是1,不满住要求,继续舍去....
注意事项:
1、不能对rownum使用>(大于1的数值)、>=(大于或等于1的数值)、=(大于或等于1的数值)
2、rownum是从1开始的,第一条不满足去掉的话,第二条的rownum 又成了1。
分页查询
下面是分页查询的基本格式:
select * from
(select T.*, rownum rn from
(select * from tab) T
where rownum <= page*pagesize)
where rn > (page - 1)*pagesize;
-- page表示显示的页数,pagesize表示每页的大小
下面看一个实例:
select * from
(select A.*, rownum rn from
(select * from emp ) A
where rownum <= 3*3)
where rn>(1-0)*3;
-- 查询emp表的第3页内容,每页的大小是3
相同的要求,也可以这样写:
select * from
(select A.*, rownum rn from
(select * from emp ) A
)
where rn between (1-0)*3 and 3*3;
但是,大部分情况下,第一个查询的效率比第二个高的多。
因为在Oracle的CBO的模式下,oracle会将外层的查询条件推到内层中,来提高查询结果。第一个查询,oracle会将第二层的查询条件推到最内层中,一旦内层的查询不满住条件就不会执行,这样就减少了不必要的查询,效率自然要比第二个的查询要快。