Oracle中rownum的基本用法
1.前言
- 用sql分页查询在mysql中我们会想到用limit,然而在oracle中并没有这个关键字,oracle不能分页了吗?不是的,rownum可以解决这一问题。
2.基本使用
注意:rownum不支持>, >=, =, !=, between…and…这几个运算符,只能用符号(<、<=)
2.1示例:查询表3条以后的记录
原始数据
错误示范
select id,name from practice where rownum > 3;
这种查询是没有结果的,select id,name from practice where rownum = 3
这种也是错误的。
原因:
ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。
它取得第一条记录则rownum值为1,第二条为2,依次类推。
如果你用>,>=,=,between…and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除, 接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。(select id,name from practice where rownum between 1 and 5
这种情况除外)
正解
先把rownum的列与table"拼接"作为一个子表来查询,这样rownum所在的列就是代表一个属性(重点是取别名,不取别名它依然是按照以前那种序列排序)
select *
from (
select ROWNUM r,CB_BA_BANK_PRACTICE.*
from practice
) where r > 3;
2.2选取列表中某个值前3的所有记录
例如:
- 选取排序号前三的记录
错误示范
select *
from practice where ROWNUM < 3 order by ID_ desc;
以前这么写我记得会先去取前两列值在排序,这里竟然对了 :o,有人知道指正吗
正解
先排序去重
select distinct * from practice order by ID_ desc;
再选出前3的sal
select *
from (
select distinct * from CB_BA_BANK_PRACTICE order by ID_ desc
) where ROWNUM < 3;
2.3选取区间[a,b]的记录
这里的思想和第一个例子思想是一样的,先把rownum的列与table"拼接"作为一个子表来查询,这样rownum所在的列就是代表一个属性(重点是取别名,不取别名它依然是按照以前那种序列排序)在对这个值进行between 处理;
3.分页查询
单表:
SELECT * FROM (
SELECT p.*,ROWNUM r FROM CB_BA_BANK_PRACTICE p WHERE ROWNUM < pageNumber*pageSize
) WHERE r > pageNumber*pageSize