Oracle前10条记录
在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
Oracle前10条记录的更多相关文章
- oracle 取前10条记录
1.oracle 取前10条记录 1) select * from tbname where rownum < 11; 2) select * from (select * from tbnam ...
- 如何取得select结果数据集的前10条记录。postgresql
我用的是POSTGRESQL.select name from t_personal order by personal_id desc 我想取得上面结果数据的,前10条记录.SQL语句怎么改. 我记 ...
- Oracle中查询前10条记录
在Oracle怎样查询表中的top10条记录呢? select * from test where rownum <=10 ----说明:rownum只能用于<或<=运算,如 ...
- oracle取前10条记录
--oracle取前十条数据 --(1)第一种 ; --(2)第二种 ;
- oracle查询前10条记录
select * from table_name where rownum<11;
- Oracle 取前几条记录
今天看了篇文章,对oracle取前几条数据的方式和说明,总结比较全,学习了,做个记录点.oracle 取前10条记录 以下内容是原始文章内容,用于做留存阅读. 1.oracle 取前10条记录 1) ...
- 各数据库查询前N条记录的SQL语句
sql在不同数据库查询前几条数据 1. ORACLE SELECT * FROM TABLE_NAME WHERE ROWNUM <= N; HQL: from table_name t or ...
- Oracle-查询最近更新的前10条数据
在实际用途中,常常会要求取最近的几条纪录,这就需要先对纪录进行排序后再取rownum <= 一般常见的 SELECT * FROM (SELECT a.* FROM torderdetail a ...
- 各个数据库中,查询前n条记录的方法
SQL查询前10条的方法为: 1.select top X * from table_name --查询前X条记录,可以改成需要的数字,比如前10条. 2.select top X * from ...
随机推荐
- SDL显示内存中的图像
<textarea readonly="readonly" name="code" class="c++"> #include ...
- java数组复制的方式和效率比较
java中,数组的复制有以下三种方式: 1. 调用System.arraycopy(Arrays.copyOfRange可以当作第四种,但是底层调用的是System.arraycopy,所以,认为是同 ...
- 剑指offer-面试题4.替换空格
题目:请实现一个函数,把字符串中的每个空格都替换成"%20".例如输入"We are happy." 则输出"We%20are%20happy.&qu ...
- HDU1754(线段树)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- Linux 多线程开发
在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反, ...
- Ice_cream's world I
Ice_cream's world I Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- mysql的常用操作的封装
1.概述: 为了把繁琐的操作简化成简单的类,设计了2个类用来封装了mysql的常用操作,以便使用者可以方便地使用. 2.组成 1)数据库操作类CDatabaseConnect 2)SQL对象类CSql ...
- Gulp及组件安装构建
Gulp 是一款基于任务的设计模式的自动化工具,通过插件的配合解决全套前端解决方案,如静态页面压缩.图片压缩.JS合并.SASS同步编译并压缩CSS.服务器控制客户端同步刷新. Gulp安装 全局安装 ...
- 物理机与虚拟机IP互ping通,而互ping主机名不通
问题描述:虚拟机信息:VMware-workstation 10安装RHEL5.8操作系统.hostname:rhel201.com IP:192.168.1.201 物理机系统:windows 7主 ...
- oracle Can't connect to X11 window server using ':0.0' /Checking monitor: must be configured to display at least 256 colors解决方法
Can't connect to X11 window server using ':0.0' 解决方法 1. 以oracle 用户登陆X window 或者 2. root 身份执行 # xhost ...