ORACLE中用ROWNUM分页并排序的SQL语句
来源:互联网 发布:json实体类工具 编辑:程序博客网 时间:2024/04/29 13:29
ORACLE中用ROWNUM分页并排序的SQL语句
以前分页习惯用这样的SQL语句:
select * from
(select t.*,rownum row_num from mytable t order by t.id) b
where b.row_num between 1 and 10
结果发现由于该语句会先生成rownum 后执行order by 子句,因而排序结果根本不对,后来在GOOGLE上搜到一篇文章,原来多套一层select 就能很好的解决该问题,特此记录,语句如下:
select * from
(select a.*,rownum row_num from
(select * from mytable t order by t.id desc) a
) b where b.row_num between 1 and 10
====================oracle rownum 及分页处理的使用方法===============
oracle rownum 及分页处理的使用方法
在实际应用中我们经常碰到这样的问题,比如一张表比较大,我们只要其中的查看其中的前几条数据,或者对分页处理数据。在这些情况下我们都需要用到rownum。因此我们要理解rownum的原理和使用方法。
Oracle原理
Oracle的rownum经常使用的符号有(<、<=、!=),其他比如(>,>=,=,between...and)oracle也能编译成功,但是结果却查不出一条记录来,
假设某个表 student(sno,sname) 有 10 条记录
如果用 select rownum ,sno from student where rownum < 5, 只要是用小于号,查出来的结果正确的。
可如果用 select rownum ,sno from student where rownum > 5 。这条语句表面上的意思很好理解表中有10条数据,找rownum>5 的也就相当于找后面5条数据。可是结果确不想我们期待的那样出来后面的5条数据。
先好好理解 rownum 的原来。因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。所以您没办法期望得到下面的结果集:
11 sn11
12 sn12
13 sn13
.................---
rownum>5 没有记录,因为第一条不满足去掉的话,第二条的ROWNUM又成了1,所以永远没有满足条件的记录。或者可以这样理解:
ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。
有了以上从不同方面建立起来的对 rownum 的概念,那我们可以来认识使用 rownum 的几种现像
1. select rownum,sno from student whererownum != 10 为何是返回前9条数据呢?它与 selectrownum,c1 from tablename where rownum < 10 返回的结果集是一样的呢?
因为是在查询到结果集后,显示完第 9 条记录后,之后的记录也都是 != 10,或者 >=10,所以只显示前面9条记录。也可以这样理解,rownum 为9后的记录的rownum为10,因条件为 !=10,所以去掉,其后记录补上,rownum又是10,也去掉,如果下去也就只会显示前面9条记录了
2. 为什么 rownum>1 时查不到一条记录,而 rownum >0 或rownum >=1 却总显示所以的记录
因为 rownum 是在查询到的结果集后加上去的,它总是从1开始
分页处理
但如果就是想要用 rownum > 5 这种条件的话话就要用嵌套语句,把 rownum 先生成,然后对他进行查询。
select *
from (selet rownum as rn,student.* from student where ...)
where rn >5
显示6-10条数据
select *
from (selet rownum as rn,student.* from student where ...)
where rn >5 and rn <=10 ;
一般代码中对结果集进行分页就是这么做的的。
- ORACLE中用rownum分页并排序的SQL语句
- ORACLE中用rownum分页并排序的SQL语句
- ORACLE中用rownum分页并排序的SQL语句
- ORACLE中用ROWNUM分页并排序的SQL语句
- ORACLE中用rownum分页并排序的SQL语句
- ORACLE中用rownum分页并排序的SQL语句
- ORACLE中用ROWNUM分页并排序的SQL语句
- ORACLE中用rownum分页并排序的SQL语句
- ORACLE中用rownum分页并排序的SQL语句
- ORACLE中用rownum分页并排序的SQL语句
- ORACLE中用rownum分页并排序的SQL语句
- ORACLE中用rownum分页并排序的SQL语句
- ORACLE中用rownum分页并排序的SQL语句
- ORACLE中用rownum分页并排序的SQL语句
- ORACLE中用rownum分页并排序的SQL语句
- ORACLE中用rownum分页并排序的SQL语句
- ygfmobileORACLE中用rownum分页并排序的SQL语句
- oracle排序并分页sql语句
- wait和sleep区别
- Mac解决端口占用
- hibernate4.0+版本和3.0+版本的区别总结
- mac下tomcat的安装与配置
- Java 6.25
- ORACLE中用ROWNUM分页并排序的SQL语句
- C#操作SQL Server数据库
- 测试OOM异常
- apple 团队电话
- 监听滚动条来做异步加载图片
- TCP/IP协议族-----19、域名系统(DNS)
- 什么是反射机制?
- svn迁移到git下全过程
- jQuery/Ajax/PHP/Json 的一个综合例子