但行好事
莫论前程❤

Oracle查询排序后取第N条–rownum

  • 按照id排序后取第一条
select * from (select * from testStudent order by id desc) where rownum=1;

先执行括号里面的  查询出所有学生,并进行降序排序,在执行外面的 rownum=1 获取第一条语句。

在说下为什么下面的语句不可以获取我们想要的第一条数据呢

select * from testStudent where rownum=1 order by id desc ;

主要是顺序不对,select * from testStudent where rownum=1  执行到这里的时候其实只有一条数据了 order by id desc在进行降序排序也没有什么意思 应为只有一条语句了

查询前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;

注意

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

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

第二种方法:

先查字表,按时间排序,主表查字表时,自动生成伪列,并查询伪列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  --则为从第一条后面的记录开始展示,也就是说从第二条开始。
赞(0) 打赏
未经允许不得转载:刘鹏博客 » Oracle查询排序后取第N条–rownum
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

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

支付宝扫一扫打赏

微信扫一扫打赏