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

文章目录

  • ​​考考你​​
  • ​​t_user表有20条记录,执行下列语句会返回多少条记录?​​
  • ​​主内容​​
  • ​​rownum > 1 不返回任何结果的问题​​
  • ​​rownum 大于条件的使用​​
  • ​​设置表的某一列为1到n序号​​
  • ​​oracle的分页例子(mybatis)​​
  • ​​oracle的分页例子(纯sql)​​
  • ​​答案部分​​
  • ​​其他​​
  • ​​参考文献​​
  • ​​oracle官网帮助中心(文档)​​

考考你

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 <= (#{pageSize,jdbcType=VARCHAR}*#{page,jdbcType=VARCHAR}) --第一层设置右边界
) b2
where rn >= ((#{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。