rownum属于oracle中的伪列(pseudoColumns)。 用法有些细节,所以单独拉出来说明。
文章目录
考考你
t_user表有20条记录,执行下列语句会返回多少条记录?
语句为:
select * from t_user where rownum > 10 ;
主内容
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。