oracle的分页函数rownum

rownum属于oracle中的伪列(pseudoColumns)。 用法有些细节,所以单独拉出来说明。

考考你

t_user表有20条记录,执行下列语句会返回多少条记录?

语句为:

 select * from t_user where rownum > 10 ;

题目1答案

主内容

rownum > 1 不返回任何结果的问题

select * from t_user where rownum > 5;
该语句不返回任何结果。为什么呢?

描述:
rownum是从1开始的。
逐条拿出记录并分配rownum,再进行rownum条件判断。

过程:
先拿出一条,分配rownum=1,判断是否符合rownum>1。
不符合,丢弃掉。

再拿出一条,因为上一条丢弃掉了,所以这条rownum仍然是1,
不符合条件,继续丢弃。

以此类推,后续都不符合。所以不返回任何记录。

rownum 大于条件的使用

有的场景确实要用到rownum大于n的条件,如何使用呢?

其实很简单,给rownum加个列别名即可。sql如下:

select 
* 
from 
(
	select 
	product_name,price,rownum as rn
	from t_product where rownum < 10
) a
where a.rn >5

设置表的某一列为1-n序号

有的表没有序号列,添加列之后,可以用如下语句设置序号值:

UPDATE t_user SET sequence = ROWNUM;

这样就sequence列就是1-n的序号的。

oracle的分页例子

oracle中where rownum只能写个大写或者小写。 所以需要包2层。例如mybatis中:

select
*
from
(
  select
  b1.*,
  rownum rn
  (
    select
    *
    from
    t_user  
    where username like '%a%'
  ) b1
  where rownum &lt;= (#{pageSize,jdbcType=VARCHAR}*#{page,jdbcType=VARCHAR}) --第一层设置右边界
) b2
where rn &gt;= ((#{page,jdbcType=VARCHAR}-1)*#{pageSize,jdbcType=VARCHAR} +1) -- 第二层,设置左边界

答案部分

题目1答案

t_user表有20条记录,执行下列语句会返回多少条记录?

是10条吗? 当然不是,实际不返回任何数据。
原因本文档中有。

其他

参考文献

oracle官网rownum文档:
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/RO WNUM-Pseudocolumn.html#GUID-2E40EC12-3FCF-4A4F-B5F2-6BC669021726

oracle官网帮助中心(文档)

https://docs.oracle.com/en/
输入搜索内容即可检索,例如搜索 rownum。

猜你喜欢

转载自blog.csdn.net/enthan809882/article/details/114131454