Oracle中的伪列ROWNUM

Oracle中的利用伪列ROWNUM的分页查询。
SELECT * FROM (SELECT ROWNUM RN, T.* FROM TABLE T WHERE ROWNUM < 20) A WHERE A.RN>10;
这是查询第11条到第19条数据,括号里面的嵌套查询中总是<或者<=。为什么不能是>号呢?
当我们把嵌套里的ROWNUM<20改成ROWNUM改成>10,外面的A.RN>10改成A.RN<20后,会发现查询出来没有数据。
这是因为ORACLE中的ROWNUM是伪列,就只是在查出数据集后,再在数据集的基础上面加一个序列,这个序列总是从1开始,连续递增1的。
我们可以把通过伪列分页比作修楼房,伪列(ROWNUM)就是一层一层的楼房,比如我们只要9层楼,然后ROWNUM<10这样,我们就可以查询9条数据。但是你只想要10层楼到19楼,这样是不行,没有楼下1到9层,怎么会有10层呢?这就是伪列总是从1开始连续递增的。

SELECT * FROM TABLE WHERE ROWNUM!=10
这条SQL语句总是只能查询第1条到第9条数据,因为伪列总是连续递增的,比如不要第10层楼,11层楼怎么盖得上去呢?

为什么外面的WHERE条件可以是大于呢(WHERE A.RN>10)?
因为里面的查询语句SELECT ROWNUM RN, T.* FROM TABLE T WHERE ROWNUM < 20,RN这一列对于表T而言是伪列取了别名,但是对于表A而言是真正的列,所以它跟普通的列的使用方式一样。所以我们也可以通过把伪列放在嵌套查询里面来当作真实的列来使用,比如SELECT * FROM (SELECT ROWNUM RN, T.* FROM TABLE T) A WHERE A.RN>10 AND A.RN<20;这样也可以实现分页,但是这个的SQL语句的效率,没有上面第一条SQL的效率高。

当我们在使用排序的时候用伪列,比如
SELECT ROWNUM RN, T.* FROM TABLE T ORDER BY T.NAME
会出现ROWNUM不是从1连续递增的,而是打乱了顺序,这是因为系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询
SELECT ROWNUM RN, T.* FROM (SELECT * FROM TABLE ORDER BY NAME) T

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值