当前位置: 首页 > news >正文

在Oracle怎样查询表中的top10条记录

在Oracle怎样查询表中的top10条记录呢?

  select *

  from test

  where rownum <=10

  下面是关于rownum的介绍

  ================================

  Rownum和row_number() over()的使用

  ROWNUM是Oracle从8开始提供的一个伪列,是把SQL出来的结果进行编号,始终从1开始,常见的用途就是用来分页输出.

  比如

  SELECT *

  FROM torderdetail a

  WHERE ROWNUM <= 10

  这条语句就是输出前10条纪录,在这里用途上类似于sql sever的top,不过rownum对于指定编号区间的输出应该说更强大

  SELECT *

  FROM (SELECT a.*, ROWNUM rn

  FROM torderdetail a)

  WHERE rn >= 10 AND rn <= 20

  这条语句即是输出第10到第20条纪录,这里之所以用rownum rn,是把rownum转成实例,因为rownum本身只能用 <=的比较方式,只有转成实列,这样就可做 >=的比较了。

  在实际用途中,常常会要求取最近的几条纪录,这就需要先对纪录进行排序后再取rownum <=

  一般常见的

  SELECT *

  FROM (SELECT a.*

  FROM torderdetail a

  ORDER BY order_date DESC)

  WHERE ROWNUM <= 10

  而在CSDN曾经发生过讨论,关于取近的10条纪录,有人给出这样的语句

  SELECT a.*

  FROM torderdetail a

  WHERE ROWNUM <= 10

  ORDER BY order_date DESC

  之所以会出现这样的语句,主要是从效率上的考虑,前面条语句,是要进行全表扫描后再排序,然后再取10条纪录,后一条语句则不会全表扫描,只会取出10条纪录,很明显后条语句的效率会高许多。

  那为什么会有争议呢,那就在于在执行顺序上争议,是先执行排序取10条纪录,还是取10条纪录,再排序呢?两种顺序取出来的结果是截然相反的,先排序再取10条,就是取最近的10条,而先取10条,再排序,则取出的最早的10条纪录。对于此语句,普遍的认为执行顺序是先取10条纪录再排序的。所以此语句应该是错误。但实际上并非如此,此语句的执行顺序和order by的字段有关系,如果你order by 的字段是pk,则是先排序,再取10条(速度比第一种语句快),而排序字段不是PK 时,是先取10条再排序,此时结果就与要求不一样了,所以第二种写法一定要在排序字段是主键的情况下才能保证结果正确。

  Row_number() over()这个分析函数是从9I开始提供的,一般的用途和rownum差不多。

  一般写法row_number() over( order by order_date desc) 生成的顺序和rownum的语句一样,效率也一样(对于同样有order by 的rownum语句来说),所以在这种情况下两种用法是一样的。

  而对于分组后取最近的10条纪录,则是rownum无法实现的,这时只有row_number可以实现,row_number() over(partition by 分组字段 order by 排序字段)就能实现分组后编号,比如说要取近一个月的每天最后10个订单纪录

  SELECT *

  FROM (SELECT a.*,

  ROW_NUMBER () OVER (PARTITION BY TRUNC (order_date) ORDER BY order_date DESC)

  rn

  FROM torderdetail a)

  WHERE rn <= 10

  Rownum的另类用法,有时候我们会遇到这种需求,要求输出当月的所有天数,许多人会烦恼,数据库里又没有这样的表,怎么输出一个月的所有天数呢?用rownum就能解决:

  SELECT TRUNC (SYSDATE, 'MM') + ROWNUM - 1

  FROM DUAL

  CONNECT BY ROWNUM <= TO_NUMBER (TO_CHAR (LAST_DAY (SYSDATE), 'dd'))

原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/database/27/11420027.shtml

转载于:https://www.cnblogs.com/jinzhengquan/archive/2011/06/21/2085811.html

相关文章:

  • C#抓取网页数据、分析并且去除HTML标签
  • 漫游用户配置文件的实现方法
  • Dreamweaver入门基础与HTML视频教程
  • Java深度历险(八)——Java I/O
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • c#做外挂
  • 网络设备日常维护要求
  • SQL查询语句精华
  • LR日志输出
  • poj2080
  • C# WinForm 同程序只能运行一个
  • 关于C#中Thread.Join()的一点理解
  • VMware中Linux分辨率设置问题
  • RTEMS网络内部的同步
  • 如何才能做到网站高并发访问?
  • 「译」Node.js Streams 基础
  • 【翻译】babel对TC39装饰器草案的实现
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 08.Android之View事件问题
  • Docker: 容器互访的三种方式
  • interface和setter,getter
  • jquery cookie
  • JS实现简单的MVC模式开发小游戏
  • leetcode-27. Remove Element
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 坑!为什么View.startAnimation不起作用?
  • 前端相关框架总和
  • 译有关态射的一切
  • 阿里云重庆大学大数据训练营落地分享
  • 大数据全解:定义、价值及挑战
  • 数据可视化之下发图实践
  • 说说我为什么看好Spring Cloud Alibaba
  • #Linux(make工具和makefile文件以及makefile语法)
  • $L^p$ 调和函数恒为零
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (论文阅读30/100)Convolutional Pose Machines
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转载)OpenStack Hacker养成指南
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .Net 6.0 处理跨域的方式
  • .NET Core跨平台微服务学习资源
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [2]十道算法题【Java实现】
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [C++]18:set和map的使用
  • [Codeforces] number theory (R1600) Part.11
  • [HTML]Web前端开发技术29(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • [iOS]如何删除工程里面用cocoapods导入的第三方库
  • [pluginviteimport-analysis] vite 提示jsx语法报错