- 按照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 --则为从第一条后面的记录开始展示,也就是说从第二条开始。
评论前必须登录!
注册