为了账号安全,请及时绑定邮箱和手机立即绑定

有大佬知道,oracle中的rownum 是什么时候产生的?求解释!

有大佬知道,oracle中的rownum 是什么时候产生的?求解释!

HUWWW 2021-08-25 19:15:00
oracle 中的rownum 是什么时候产生的?在一个查询语句中select a,*, rownum from testgroup by a.sysid等到的rownum并不是按顺序排的。
查看完整描述

3 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

rownum是在你操作数据的时候,会默认生成一个序号从1开始,一直到记录的总条数,数字不会跳跃。

几种常见的用法:

  1. select rownum,c1 from t1 where rownum != 10 返回的结果是前9条,原因很简单,取出来前9条后,跳过第10条,后面的会继续补充第10条,这样一直到结尾都还是第十条,不满足条件,也就是前面的 9条。

  2. select rownum,c1 from t1 where rownum  between 1 and 10;查询的结果是1到10条,从序号1到10的数据。

  3. select rownum,c1 from t1 where rownum  between 2 and 10;查询结果为空,因为跳过第一条,下一条记录继续rownum为1.一直到数据结束也还是1.也就不存在从2开始的数据。


查看完整回答
反对 回复 2021-08-30
?
aluckdog

TA贡献1847条经验 获得超7个赞

在我说什么时候产生的之前,我想说一下SELECT这个查询语句的执行顺序问题:
语法是:
select * from table_name
where conditons1
group by some_column
having conditions2
order by some_column;
执行时是这样的:先从表中查询出所有的数据,然后conditions1中筛选出符合条件的数据,然后对数据进行分组,having是对分组后的数据进行筛选,最后进行排序,不过聚合函数与group by一起出现时,聚合函数会后执行.
明白这个之后,rownum这个伪列就不可能会在where之后出现,所以不管查询有什么条件,在完成
select * from table_name这个时候,它就出现了,就会在表的每一行上按顺序加上rownum.
比如你说的这个查询如果想按顺序出现rownum应该这样写:
select a.*,rownum a_rownum from(
select * from test group by a.sysid
) a;
当然了里面的子查询要正确;
如果说你想对test表中的数据查询出来之后,按SYSID这一列进行排序后查询3到5条数据,类似于小数据量(千万条以内)的先排序后分页:语句可以这样写
select * from (
select a.*,rownum t_rownum from (
select * from test order by sysid
)
) where t_rownum between 3 and 5;
总之就是说:select a.* ,rownum a_rownum from table_name a时就会在列上按顺序加上rownum.



查看完整回答
反对 回复 2021-08-30
  • 3 回答
  • 0 关注
  • 399 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信