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的分页例子(mybatis)

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

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

oracle的分页例子(纯sql)

select
*
from
(
  select
  b1.*,
  rownum rn
  from
  (
  	-- 替换部分start
    select
    *
    from
    t_user  
    where username like '%a%'
    -- 替换部分end
  ) b1
  where rownum <= (2000*1) --第一层设置右边界
) b2
where rn >= ((1-1)*2000 +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。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值