oracle中的rownum详解

oracle中的rownum详解1.概述rownum是Oracle引入的虚列。在物理上这个虚列并不存在,只是在查询时才构造出来。伪列通常是自由分配的,用户无法执行修改等操作。2.特点关于rownum有以下主要特点:1)row

大家好,又见面了,我是你们的朋友全栈君。

1. 概述
rownum是Oracle引入的虚列。
在物理上这个虚列并不存在,只是在查询时才构造出来。伪列通常是自由分配的,用户无法执行修改等操作。

2. 特点
关于rownum有以下主要特点:

1)rownum不属于任何表。
2)rownum存在的前提,先有结果表。
3)rownum总是从1开始。
4)rownum一般只和<(<=)一起用。
5)使用rownum进行分页查询需要把rownum转化为实列,并针对rownum查询。
2. 机制原理
rownum的用法看似奇怪,其实如果明白其机制原理就会很简单。
首先我们来做个简单的实验:从dual表中取出所有的字段,并取出rownum。
如果我们采用如下的写法:t.rownum

<span role="heading" aria-level="2">oracle中的rownum详解

这样运行就会报01747错:

<span role="heading" aria-level="2">oracle中的rownum详解

因为实际上,dual表就不存在rownum这个字段,所以我们无法使用t.rownum的格式。
正确的写法,应该是:

<span role="heading" aria-level="2">oracle中的rownum详解

所以,rownum是一个虚列,不属于任何表。

那么这虚列是怎么来的。我们在做个简单的实验,便于理解:
如下,我们有一个简单的表:test_ljb,共有十条记录。
我们加上rownum。

<span role="heading" aria-level="2">oracle中的rownum详解

结果如下,很好理解,选出十条记录,rownum从1到10

<span role="heading" aria-level="2">oracle中的rownum详解

我们加上一个salary的筛选条件:

<span role="heading" aria-level="2">oracle中的rownum详解

结果如下:选出三条记录,rownum从1到3

<span role="heading" aria-level="2">oracle中的rownum详解

需要注意的是,第二个结果表的rownum对应的employee和第一张并不对应。
如:在第一张表rownum为1时,对应的时Arvin,而第二张对应的是Oracle。

原因如下:
因为rownum是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列。
简单的说,rownum是对符合条件结果的序列号。它总是从1开始排起的,所以选出的结果不可能跳过1,而有其他大于1的值。
或者说,rownum是一个动态的,根据新的结果集实时变化的。

比如,如下语句:

select t.*, rownum from test_ljb t where rownum >1; –大于2、3或者其他任何大于1的值,结果相同。

<span role="heading" aria-level="2">oracle中的rownum详解

我们发现没有符合条件的记录。

根据原理,rownum是对结果集的从1开始排。那么以上的语句的结果集是什么呢?

事实上,当执行完from test_ljb时,我们可以把他当作时一个结果表,rownum是从1-10。
然后,重点,当我们执行过滤条件,rownum>1 时,第一条记录不满足,剔除。这个时候,新的结果集产生了,原来的第二条记录就成了第一条,相应的rownum变为了1-9。
再次比较原来的第一条,现在的第二条记录,他的rownum也是1,也不满足,rownum是1-8。
以此类推,流水的记录,铁打的rownum从1开始。所以,直到rownum是1,还不满足。所以最后没有记录被筛选出来,也没了rownum。

所以,我们写出的这类语句:

<span role="heading" aria-level="2">oracle中的rownum详解

统统都是没结果的。

不过有意思的是,选出前十条,可以有好多写法:

<span role="heading" aria-level="2">oracle中的rownum详解

3. 用法
那有的同学就犯嘀咕了,我要做大于查询怎么搞啊,分页查询怎么搞啊,人家Mysql和Hive一个limit a, b 直接完事,你Oracle怎么搞。
其实方法还是有的,也是用rownum,不过要先把这货转化为实列。加个子查询就可以了。
老套路,简单实验走一波。

3.1 大于查询
还是test_ljb表,就选>5行。

<span role="heading" aria-level="2">oracle中的rownum详解

3.2.1 简单分页查询
<span role="heading" aria-level="2">oracle中的rownum详解

<span role="heading" aria-level="2">oracle中的rownum详解

3.3.2 排序分页查询
排序分页查询就麻烦了,首先要排序,然后再排序的基础上再筛选。
当然这个也是实际项目最常用的。
选出薪水最高的第4、5、6个。

 

<span role="heading" aria-level="2">oracle中的rownum详解

这里需要注意的是:rownum仅仅针对新的结果集动态标记,而排序并不会生成新的结果集,如果仅仅执行

<span role="heading" aria-level="2">oracle中的rownum详解

结果如下:

<span role="heading" aria-level="2">oracle中的rownum详解

来源:CSDN
原文:https://blog.csdn.net/qq_36743482/article/details/78919904
版权声明:本文为博主原创文章,转载请附上博文链接!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155285.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • idea最新激活码2022【2021免费激活】

    (idea最新激活码2022)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~0HKL…

    2022年3月31日
  • 二进制如何转十进制?_二进制转换为十进制的算法

    二进制如何转十进制?_二进制转换为十进制的算法1、计算机的数制介绍数制:计数的方法,指用一组固定的符号和统一的规则来表示数值的方法数位:指数字符号在一个数中所处的位置基数:指在某种进位计数制中,数位上所能使用的数字符号的个数位权:指在某种

    2022年8月5日
  • matlab物理碰撞建模_opencascade 碰撞检测

    matlab物理碰撞建模_opencascade 碰撞检测碰撞检测Note本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。当试图判断两个物体之间是否有碰撞发生时,我们通常不使用物体本身的数据,因为这些物体常常会很复杂,这将导致碰撞检测变得很复杂。正因这一点,使用重叠在物体上的更简单的外形(通常有较简单明确的数学定义)来进行碰撞检测成为常用的方法。我们基于这些简单的外形来检测碰撞,…

    2022年10月27日
  • 环境变量和shell变量

    环境变量和shell变量变量分类变量分为环境变量和shell变量环境变量相当于全局变量,适用于当前SHELL(父进程)和由父进程调用的子进程,如打开编辑器vi、脚本、应用或是再打开一个子shell。shell变量就是当前shell使用的变量了,它只是“本地“有效,相当于本地变量,不适用于其他子进程,只在当前shell生命周期内有效永久变量不管是自定义的变量还是通过export导为环境变量的自定义变量都只是在shell生命周期内有效,这样的变量就是临时变量,如果我想设置一个变量使其永久生效怎么办呢?可以修改两个配置文

    2022年8月9日
  • Qt实现抽奖程序

    Qt实现抽奖程序一、简介该程序命名为Lucky,实现的功能如下:1.加载抽奖人员名单,并保存加载路径;2.单击左键或者点击ctrl+s开始抽奖,并滚动显示人员名单,显示的人员名单格式为部门-姓名。3.

    2022年7月3日
  • 微机原理课程设计电梯控制系统_列举一个计算机控制系统的应用实例

    微机原理课程设计电梯控制系统_列举一个计算机控制系统的应用实例1、针对一个具有大纯时延时间的一阶惯性环节(G(s)=K*e-θs/(Ts+1))温度控制系统和给定的系统性能指标,(工程要求相角裕度为30~60,幅值裕度>6dB);要求测量范围-50℃~200℃,测量精度0.5%,分辨率0.2℃;2、书面设计一个计算机控制系统的硬件布线连接图,并转化为系统结构图;3、选择一种控制算法并借助软件工程知识编写程序流程图;4、用MATLAB和SIMULINK进…

    2022年10月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号