Oracle查询排序后的前10条记录

查询表CMS_GPS中,车牌号为“苏EFN588”,时间最近的前10条记录,

不可以写成下面这样,这样写是先搜索出前10条记录,然后再按时间倒序排列,

SELECT * FROM CMS_GPS WHERE VEHICLE_NO = '苏EFN588' AND ROWNUM <11 ORDER BY TIMESTAMPS DESC;

第一种方法:

先查子表,按时间排序,并添加序号,主表查字表时筛选序号<11的,

SELECT * FROM 
(SELECT CG.*,ROWNUM rn FROM CMS_GPS CG WHERE VEHICLE_NO = '苏EFN588' ORDER BY TIMESTAMPS DESC)
WHERE rn < 11;

注意

  1. * 和 ROWNUM 一起查询时候,*前面必须加表名称做前缀,即 select CG.* , ROWNUM.....
  2. ROWNUM 不能以任何表的名称作为前缀,CG.ROWNUM 是非法的。
  3. rownum和排序:rownum在前,order by在后,rownum的是在取数据的时候产生的序号,而不是order by后产生的序号,想要按照排序后的结果编号,必须用子查询。

SQL> select rownum ,id,name from student order by name;
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
         3 200003 李三
         2 200002 王二
         1 200001 张一
         4 200004 赵四
可以看出,rownum并不是按照排序后的列来生成的序号。系统是按照记录插入时的顺序来编号的

为了获得排序后的编号,必须使用子查询;
SQL> select rownum ,id,name from (select * from student order by name);
    ROWNUM ID     NAME
---------- ------ ---------------------------------------------------
         1 200003 李三
         2 200002 王二
         3 200001 张一
         4 200004 赵四

 

第一种效率低,提供效率更高的第二种方法,

第二种方法:

先查字表,按时间排序,主表查字表时,自动生成伪列,并查询伪列ROWNUM<11的,

SELECT * FROM 
(SELECT * FROM CMS_GPS WHERE VEHICLE_NO = '苏EFN588' ORDER BY TIMESTAMPS DESC)
WHERE rownum < 11;

查询第5-10条数据:

select * from (select CG.*,rownum as rn from CMS_GPS CG where VEHICLE_NO = '苏EFN588' and rownum<11) where rn>6;

查询时间最近的第5-10条数据:

select * from 
	(SELECT aaa.*,ROWNUM rn FROM 
		(SELECT * FROM CMS_GPS WHERE VEHICLE_NO = '苏EFN588' ORDER BY TIMESTAMPS DESC) aaa
		WHERE rownum < 11
	)
where rn>4;

错误示范:

 ORACLE查询第N~M条记录的方法:

select * from (select a.*,a.rownum rn from (select * from table_name) a where a.rownum<M) where rn>n
--这句就是从n到m也的数据,分为三层结构

第一个错误:rownum前面不可以加表名做前缀,第二,三层结构太繁琐,可以优化为二层结构,

select * from (select a.*,rownum rn from table_name a where rownum<M) where rn >n;

MYSQL查询前10条、第2~10条记录的方法:

select * from table_name limit 0,10  --通常0是可以省略的,直接写成  limit 10。0代表从第0条记录后面开始,也就是从第一条开始
select * from table_name limit 1,10  --则为从第一条后面的记录开始展示,也就是说从第二条开始。

MSSQL查询前10条的方法为:

select top X * from table_name  --查询前X条记录,可以改成需要的数字。
select top n * from (select top m * from table_name order by column_name ) a order by column_name desc  --查询第N到M条记录。常用的分页也是这种方式。
例如常用的分页方式:
declare @page int
declare @row int
set @page=2 --页数
set @row=3  --每页展示行数
select top (@row) * from (select top (@row*@page) * from table_name order by id  ) a order by id desc  --最基本的分页方式,改变@row和@page达到分页效果

 

 

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值