Oracle/PL/SQL奇技淫巧之ROWNUM伪列

这篇具有很好参考价值的文章主要介绍了Oracle/PL/SQL奇技淫巧之ROWNUM伪列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ROWNUM伪列

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

注意1:

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

id name age ROWNUM
0001 mary 18 1
0002 mike 20 2
0003 john 19 3
0004 echoo 16 4
0005 susy 18 5
0006 kitty 21 6

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

id name age ROWNUM
0002 mike 20 2
0003 john 19 3
0006 kitty 21 6

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

id name age ROWNUM
0006 kitty 21 6
0002 mike 20 2
0003 john 19 3

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

注意2:

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

id name age
0001 mary 18
0002 mike 20
0003 john 19
0004 kitty 16
0005 susy 18
0006 echoo 21

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

SELECT * FROM employees WHERE ROWNUM > 1;

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

① select 出的第一条数据为

id name age
0001 mary 18

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

id name age ROWNUM
0001 mary 18 1

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

id name age
0002 mike 20

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

id name age ROWNUM
0002 mike 20 1

⑥ 进行 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 rn
  	  FROM (SELECT * FROM employees ORDER BY employee_id) temp_table
  	 ) result_table
WHERE result_table.rn BETWEEN 起始行数 AND 结尾行数

通过嵌套查询的方式,把动态的ROWNUM伪列变成固定的列rn,然后再用rn列进行分页;文章来源地址https://www.toymoban.com/news/detail-653850.html

到了这里,关于Oracle/PL/SQL奇技淫巧之ROWNUM伪列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 奇技淫巧第8期

    学无止境。 下面是对去年11月至今年5月的零散知识点总结。 春节期间好好放松了一两个月,来校后又懒散的度过了一两个月,直到论文评审意见下来,才开启冲刺模式狂干了一两个月。总的来说,这半年来摸的时间比较多。好,不废话了,开始。 https://zhuanlan.zhihu.com/p/4595

    2024年02月04日
    浏览(29)
  • matlab奇技淫巧——绘制三维地图

      在数据处理工作中,常常会用到地图的绘制,最常用的自然是绘制平面的区域/全球地图,通过 即可绘制,效果如下,其中经度为 − 180 ∼ 180 -180sim180 − 180 ∼ 180 ,负为西经,正为东经,纬度为 − 90 ∼ 90 -90sim90 − 90 ∼ 90 ,北纬为正,南纬为负。   不过本博文题目

    2024年02月07日
    浏览(53)
  • 记录--`ElementUI` 中的奇技淫巧

    在 ElementUI 的世界中,不仅有基础的组件和功能,还有一些让你眼前一亮、 * 得不能再 * 的高级技巧和窍门。本文将揭示这些技巧,让你在前端开发的舞台上独领风骚。无论你是一个勇敢的创新者还是一个喜欢调皮捣蛋的开发者,这些技巧都将让你的 ElementUI 应用更加酷炫和有

    2024年02月08日
    浏览(32)
  • 奇技淫巧:Lambda表达式

    最近学习到的奇技淫巧: Lambda表达式 ,将函数包括递归函数改为Lambda表达式写法,可节省大量时间,在大量调用下可能节省近一半时间。 该语法过于复杂,见https://en.cppreference.com/w/cpp/language/lambda,本文仅写在算法竞赛下的应用。 该语法在OIWiki中有所提及,但是十分抽象,

    2024年02月12日
    浏览(27)
  • Intellij IDEA有什么奇技淫巧?

    IDEA全称 IntelliJIDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在 智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、创新的GUI设计 等方面的功能可以说是超常的。 idea下载地址:jetbrains.com/idea 下面来说几个I

    2024年02月15日
    浏览(38)
  • 一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频

    上一篇文章一看就懂的OpenGL ES教程——渲染宫崎骏动漫重拾童年 已经详细阐述了如何用OpenGL es将原始的YUV数据组成的视频渲染到屏幕上,想必有很多童鞋在阅读了它之后依然觉得回味无穷,学习的胃口也越来越大了,因为你们知道仅仅渲染视频是不够的,我们要的是,能够在

    2024年04月25日
    浏览(42)
  • 一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1)

    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学

    2024年04月16日
    浏览(42)
  • ORACLE数据库 —— PL/SQL知识点2

    ORACLE数据库  PL/SQL语句基础知识点  适合有SQL基础的人群。  禁止转载! 内置函数 字符串函数     lower(列名|字符串)函数用于返回字符串的小写形式。         eg.SELECT ename,sal FROM emp WHERE ename=lower(\\\'ename\\\');     upper(列名|字符串)函数用于返回字符串的大写形式。       

    2024年02月08日
    浏览(50)
  • Oracle/PL/SQL数据库基础操作(持续更新)

            PL/SQL不是一个独立的编程语言;它是Oracle编程环境中的工具。 SQL* Plus是一个互动的工具,它可以在命令提示符下键入SQL和PL/SQL语句。这些命令发送到数据库进行处理。语句处理之后将结果发回,并在屏幕上显示出来。 分类 命令 DDL create:创建;drop:删除;alter:

    2024年02月09日
    浏览(59)
  • 用PL/SQL Developer连接远程Oracle数据库

    oracle数据库安装教程参考 注意: 第六步中的Oracle基目录中的用户名为中文的话,需要去掉中文部分。然后管理口令一定保存好。 2.打开oracle安装目录(默认在C盘,我的在D盘),找到tnsnames.ora文件 这是oracle客户端所需要的一个文件,通过该文件可以配置数据库的连接地址,

    2024年02月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包