首页 > IT职业 > IT图书 > oracle简单查询之分页查询
分页查询
1、为什么需要分页?
当数据库的数据过的时候,客服端无法一次性显示所有数据,例如我们数据库表里有十万条数据,如果一下加载,查询的速度慢,用户体验差,而且用户也不可能一次性读完这个十万条数据
2、分页技术分类
物理分页(推荐)
在数据库执行查询时(实现分页查询),查询需要的数据依赖数据库SQL语句,属于后台分页
逻辑分页
先查询所有数据到内存,再从内存截取需要数据采用程序内部逻辑,属于前台分页 3、ORACLE实现
2.1、说明
ORACLE分页采用ROWNUM
2.2 、语法格式
格式1(推荐)
SELECT * FROM
(
SELECT temp.*, ROWNUM RN
FROM (SELECT * FROM 表名) temp
WHERE ROWNUM =start (page-1*pagesize+1)
格式2
SELECT * FROM
(
SELECT temp.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) temp
)
WHERE RN BETWEEN start (page-1*pagesize+1) AND end (page*pagesize) 2.3、效率对比
CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第2个查询语句,第二层的查询条件WHERE ROWNUM 2.4、ROWNUM介绍
1、ROWNUM原理
执行查询操作
将第一行的row num置为1
将得到的行的rownum与条件相比较,如果不匹配,则抛弃行,如果匹配,则返回行
oracle获取下一行,然后将rownum增1
返回第3步 2、示例代码
使用rownum来查询一下数据
select rownum,emp.* from emp where rownum > 5;
说明: 发现该查询无返回任何数据,原因是第一行读取被分配为1,rownum>1使得条件为假,接着读取第二行现在变为第一行,并还分配为1,rownum使得条件依然是假,所有行随后均未能满足该条件,所以没有行被返回
rownum大于一个正整数来查询,必须使用子查询来实现
SELECT * FROM
(
SELECT temp.*, ROWNUM RN
FROM (SELECT * FROM emp) temp
WHERE ROWNUM =11
使用 BETWEEN 最小数 AND 最大数 实现
SELECT * FROM
(
SELECT temp.*, ROWNUM RN
FROM (SELECT * FROM emp) temp
)
WHERE RN BETWEEN 10 AND 15 3、使用注意事项
rownum不能以任何基表的名称作为前缀。
子查询中的rownum必须要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道rownum是子查询的列还是主查询的列。
查询rownum在某区间的数据,rownum对小于某值的查询条件为true,rownum对于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是true的。那就必须使用子查询。 来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1976/viewspace-2799232/ ,如需转载,请注明出处,否则将追究法律责任。