Sql奇技淫巧之ROWNUM伪列

ROWNUM伪列

ROWNUM是一个伪列,它是根据每次查询的结果动态生成的一列递增编号,表示 Oracle 从表中选择该行的顺序,选择的第一行ROWNUM为1,第二行ROWNUM为2,以此类推。

注意1:

ROWNUM伪列是在WHERE子句之前生成的,就是说它并不是在执行了WHERE子句过滤之后再对数据编号
比如在执行WHERE子句,结果数据是这样的:

idnameageROWNUM
0001mary181
0002mike202
0003john193
0004kitty164
0005susy185
0006echoo216

这时候的ROWNUM是一列递增排列的、完整的编号
然后如果执行一个WHERE子句:WHERE age >18
那数据就变成了:

idnameageROWNUM
0002mike202
0003john193
0004kitty216

ROWNUM出现了断层,不连续了
如果后面再执行一个ORDER BY age DESC
就变成这样了:

idnameageROWNUM
0004kitty216
0002mike202
0003john193

ROWNUM不按顺序排了
所以在利用ROWNUM伪列来对结果集做限制、过滤、排序、分页等操作的时候一定要注意这个点,不然很容易错乱;

注意2:

ROWNUM是一行一行赋值的,只有上一行数据被选择成功,下一行才会递增!而且 select 语句也是一行一行选择的,每 select 一行数据就要进行 where 条件判断。
比如有这样一个employees表:

idnameage
0001mary18
0002mike20
0003john19
0004kitty16
0005susy18
0006echoo21

对这个表执行这样一个SQL:

SELECT * FROM employees WHERE ROWNUM > 1;

这句SQL的预期为取出除第一条数据外的所有数据,但是执行的结果是一条都选不出来,来看执行过程:

① select 出的第一条数据为

idnameage
0001mary18

ROWNUM 给这条数据赋值,因为是第一条数据,所以从 1 开始,赋值完是这样的:

idnameageROWNUM
0001mary181

③ 进行 WHERE ROWNUM > 1 条件判断,1>1不满足条件,所以第一条数据被过滤掉
④ select 第二条数据

idnameage
0002mike20

ROWNUM 给这条数据赋值,因为上一条数据被过滤掉了,所以还是从 1 开始,赋值完是这样的:

idnameageROWNUM
0002mike201

⑥ 进行 WHERE ROWNUM > 1 条件判断,1>1不满足条件,所以这数据也被过滤掉
⑦ ·············
一直如此循环直到结束,都没有符合条件的数据,所以一条数据都选不出来!

例1:取前10条数据

ROWNUM来限制查询返回的行数,如下例所示:

SELECT * FROM employees WHERE ROWNUM < 11;

WHERE ROWNUM < 11表示返回查询数据的前10条;

例2:取排序后的前10条数据

不能够像下面这样直接在WHERE子句后简单的加上ORDER BY子句了

SELECT * FROM employees WHERE ROWNUM < 11 ORDER BY age;

因为这里的意思是先执行WHERE子句选出ROWNUM1~10的数据,然后再进行排列,和我们预想不符。我们要的是按年龄排序后的前10条数据。
所以应该这样写:

SELECT *FROM (SELECT * FROM employees ORDER BY employee_id)WHERE ROWNUM < 11;

这里的意思就是先执行排序,然后对排完序的结果集用ROWNUM伪列按顺序编号,然后取其中ROWNUM为1~10的那10条数据;

例3:分页

SELECT * 
FROM( SELECT temp_table.*,ROWNUM AS rnFROM (SELECT * FROM employees ORDER BY employee_id) temp_table) result_table
WHERE result_table.rn BETWEEN 起始行数 AND 结尾行数

通过嵌套查询的方式,把动态的ROWNUM伪列变成固定的列rn,然后再用rn列进行分页;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/35513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

torch.profiler

什么是torch.profiler PyTorch Profiler 是一个工具&#xff0c;它允许在训练和推理期间收集性能指标。Profiler 的上下文管理器 API 可用于更好地了解哪些模型操作最昂贵&#xff0c;检查它们的输入形状和调用堆栈&#xff0c;研究设备内核活动并可视化执行跟踪。 性能指标&…

腾讯出品Pag动画框架在Android端的使用-初级

Pag动画框架作为一个第三方框架&#xff0c;它的优缺点与Lottie是相似&#xff0c;此处不过多赘述。如果你们的项目中打算用了&#xff0c;肯定是经过了一定的调研的。Pag动画框架分几个版本&#xff0c;有免费的有收费的。我们目前用的社区免费版&#xff0c;只用来展示Pag动画…

项目实战 — 消息队列(8){网络通信设计②}

目录 一、客户端设计 &#x1f345; 1、设计三个核心类 &#x1f345; 2、完善Connection类 &#x1f384; 读取请求和响应、创建channel &#x1f384; 添加扫描线程 &#x1f384; 处理不同的响应 &#x1f384; 关闭连接 &#x1f345; 3、完善Channel类 &#x1f384; 编…

广州华锐互动:VR3D课程在线教育平台为职业院校提供沉浸式的虚拟现实学习体验

随着科技的飞速发展&#xff0c;虚拟现实(VR)和增强现实(AR)技术已经逐渐渗透到我们生活的各个领域。其中&#xff0c;VR3D课程在线教育平台作为一种新兴的教育方式&#xff0c;正在逐渐改变我们的学习方式和体验。本文将详细介绍VR3D课程在线教育平台的应用前景及特点。 VR3D课…

VFP现代物流企业管理系统的设计与实现

摘要: 随着计算机技术的广泛应用,在现代流通企业管理中引入计算机管理技术,成为一个值得深入研究的问题。 本文首先概要的论述了数据库的有关知识与现状。之后,对当代计算机数据库技术的现状,尤其是对关系型数据库作了系统的描述。在此基础上,论文重点对数据库的开发环境 …

【设计模式】工厂模式

工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工厂模式&#xff0c;可以…

Mysql整理二 - 常见查询语句面试题(附原表)

表结构&#xff0c;创建原表的代码在最后 -- cid课程id; tid老师id; sid学生id; select * from t_mysql_course; select * from t_mysql_score; select * from t_mysql_student; select * from t_mysql_teacher; 1. 查询" 01 “课程比” 02 "课程成绩高的学生的信息…

uniapp软键盘谈起遮住输入框和头部被顶起的问题解决

推荐&#xff1a; pages.json中配置如下可解决头部被顶起和表单被遮住的问题。 { "path": "pages/debug/protocol/tagWord", "style": { "app-plus": { "soft…

01.setup,reactive,ref,computed,watch学习---2023新版Vue3基础入门到实战项目

1.Vue3组合式 2.创建vue3项目 2.1认识create-vue create-vue是官方新的脚手架工具&#xff0c;vite下一代构建工具 node -v >16 npm init vuelatest 2.2 setup 原始写法 <script> export default {//执行时机比beforeCreate早//获取不到this//数据和函数必须ret…

Java实战:高效提取PDF文件指定坐标的文本内容

前言 临时接到一个紧急需要处理的事项。业务侧一个同事有几千个PDF文件需要整理&#xff1a;需要从文件中的指定位置获取对应的编号和地址。 要的急&#xff0c;工作量大。所以就问到技术部有没有好的解决方案。 问技术的话就只能写个demo跑下了。 解决办法 1. 研究下PDF文档…

案例15 Spring Boot入门案例

1. 选择Spring Initializr快速构建项目 ​ 2. 设置项目信息 ​ 3. 选择依赖 ​ 4. 设置项目名称 ​ 5. 项目结构 ​ 6. 项目依赖 自动配置了Spring MVC、内置了Tomcat、配置了Logback(日志)、配置了JSON。 ​ 7. 创建HelloController类 com.wfit.boot.hello目录下创建HelloCo…

Less和Sass的原理和用法

一、原理 1.1 Less定义&#xff1a;是一种动态的样式语言,使CSS变成一种动态的语言特性&#xff0c;如变量、继承、运算、函数。Less既可以在客户端上面运行(支持IE6以上版本、Webkit、Firefox),也可以在服务端运行(Node.js) 1.2 SaSS定义&#xff1a;是一种动态样式语言&#…

开发过程中遇到的问题以及解决方法

巩固基础&#xff0c;砥砺前行 。 只有不断重复&#xff0c;才能做到超越自己。 能坚持把简单的事情做到极致&#xff0c;也是不容易的。 开发过程中遇到的问题以及解决方法 简单易用的git命令 git命令&#xff1a; 查看有几个分支&#xff1a;git branch -a 切换分支&#…

Azure创建第一个虚拟机

首先&#xff0c;登录到 Azure 门户 (https://portal.azure.com/)。在 Azure 门户右上角&#xff0c;点击“虚拟机”按钮&#xff0c;并点击创建&#xff0c;创建Azure虚拟机。 在虚拟机创建页面中&#xff0c;选择所需的基本配置&#xff0c;包括虚拟机名称、操作系统类型和版…

【JVM】JVM 调优的参数都有哪些?

文章目录 1. 设置堆空间大小2. 虚拟机栈的设置3. 年轻代中Eden区和两个Survivor区的大小比例4. 年轻代晋升老年代阈值5. 设置垃圾回收收集器 1. 设置堆空间大小 设置堆的初始大小和最大大小&#xff0c;为了防止垃圾收集器在初始大小、最大大小之间收缩堆而产生额外的时间&…

python编程小游戏简单的,python小游戏编程100例

大家好&#xff0c;给大家分享一下python编程小游戏简单的&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 不会python就不能用python开发入门级的小游戏&#xff1f; 当然不是&#xff0c;我收集了十个python入门小游戏的源码和教程&#…

分支语句和循环语句(1)

这篇文章我们详细的把分支语句和循环语句给大家进行讲解。 分支语句&#xff1a; if switch 循环语句&#xff1a; while for do while goto语句&#xff1a; 1.什么是语句&#xff1f; C语句可分为以下五类&#xff1a; 1. 表达式语句 2. 函数调用语句 3. 控制…

qt自己实现方便的线程管理类

看本博客之前&#xff0c;可以先看看我这篇多线程博客&#xff1a;qt多线程使用方式_我是标同学的博客-CSDN博客

ORCA优化器浅析——CDXLOperator Base class for operators in a DXL tree

如上图所示&#xff0c;CDXLOperator作为Base class for operators in a DXL tree&#xff0c;其子类CDXLLogical、CDXLScalar、CDXLPhysical作为逻辑节点、物理节点和Scalar节点的DXL表示类&#xff0c;因此其包含了这些类的共同部分特性&#xff0c;比如获取其DXL节点表示的函…

Qt 文件对话框使用 Deepin风格

当你在Deepin或UOS 上开发 Qt 程序时&#xff0c;如果涉及到文件对话框功能&#xff0c;那么就会遇到调用原生窗口的问题。 如果你使用的是官方的Qt版本&#xff0c;那么在Deepin或者UOS系统上&#xff0c;弹出的文件对话框会是如下这样&#xff1a; 而Deepin或UOS系统提供的默…