Oracle基础(十二):分页查询

分页查询

分页查询就是将数据分段查询出来,而不是一次性将所有数据查询出来,一次只查询数据的一部分。
这样做可以减少系统资源开销,减少数据量可以提高网络传输速度。 

 

分页在不同的数据库中的SQL语句是不同的。ORACLE中的分页是基于伪列ROWNUM实现的 。

ORACLE中提供了一个伪列:ROWNUM
ROWNUM字段不存在于任何一张表中,但是每张表都可以查询该字段。
该字段的值是结果集中每条记录的行号。ROWNUM字段的值是伴随查询过程动态生成的。
只要可以查询出一条记录,ROWNUM就会为该条记录生成行号,从1开始每次递增1.

(1)查询第6到第10条数据

--查询无结果,不满足WHERE条件的记录是不会查询出的,所以ROWNUM并不会记录编号
select rownum,empno,ename,sal,job from emp
where rownum between 6 and 10;

由于ROWNUM是在查询表的过程中进行编号的,所以在使用ROWNUM对结果集编行号的
查询过程中不要使用ROWNUM做>1以上数字的判断,否则将查询不出任何数据。

--把ROWNUM已经给记录编号的结果集当成一个表(返回多行多列子查询,当成一张表看待)
select * from
(select rownum,empno,ename,sal,job from emp)
where rownum between 6 and 10;--查询无结果
--↑↑↑WHERE子句中的ROWNUM被视为主查询的ROWNUM,
--并不是子查询中的ROWNUM,应该给子查询的ROWNUM添加别名:
select * from
(select rownum rn,empno,ename,sal,job from emp)
where rn between 6 and 10;--这样子才能查询出数据

(2)分页查询的一些例子

--查看公司工资排名的第6-10名
select * from
(select rownum rn,empno,ename,sal,job from emp)
where rn between 6 and 10 order by sal desc;--SQL语句的优先级顺序不对
--查看公司工资排名的第6-10名(在分页查询时有排序需求的,先查询数据排序、然后使用伪列编行号、再取范围)
select * from --step3.根据子查询伪列编号取范围
(select rownum rn,t.* from--step2.给嵌套子查询用伪列给记录编号
(select empno,ename,sal from emp order by sal desc) t)--step1.子查询结果集排序
where rn between 6 and 10;

以上的查询结果会在编号在10以上的记录都会被查询出来,最后筛选出编号6-10的记录,

这样子在数据量大的时候效率并不高,我们可以在编号的时候就设定查询记录上下限来进一步减少编号数据量。

select * from --step3.查询子查询所有记录
(select rownum rn,t.* from --step2.查询子查询记录编号上限为<=10
(select empno,ename,sal from emp order by sal desc) t --step1.查询数据并排序
where rownum<=10)
where rn>=6;--step4.过滤下限记录数

(3)分页查询计算区间公式

pageSize:每页显示的条目数
page:页数(第几页) 

start:(page-1)*pageSize+1
end:pageSize*page

假设每页显示5条数据,在第2页则显示6~10行的记录:

start=6=(2-1)*5+1
end=10=2*5

 java代码如下:

int start = (page-1)*pageSize+1;
int end = pageSize*page;
String sql = "SELECT * "+
"FROM(SELECT ROWNUM rn,t.*"+
" FROM (SELECT empno,ename,sal"+
"FROM emp"+
"ORDER BY sal DESC) t"+
"WHERE ROWNUM <="+end+")"+
"WHERE rn>="+start;

 

posted @   禾喵  阅读(3664)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示