查询表CMS_GPS中,车牌号为“苏EFN588”,时间最近的前10条记录,
不可以写成下面这样,这样写是先搜索出前10条记录,然后再按时间倒序排列,
SELECT * FROM CMS_GPS WHERE VEHICLE_NO = '苏EFN588' AND ROWNUM <11 ORDER BY TIMESTAMPS DESC;
第一种方法:
先查子表,按时间排序,并添加序号,主表查字表时筛选序号<11的,
select * from
(select GG.*,rownum rn from (select * from CMS_GPS WHERE VEHICLE_NO = '苏EFN588' ORDER BY TIMESTAMPS DESC)GG)
where rn <11;
注意
- * 和 ROWNUM 一起查询时候,*前面必须加表名称做前缀,即 select CG.* , ROWNUM.....
- ROWNUM 不能以任何表的名称作为前缀,CG.ROWNUM 是非法的。
- 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达到分页效果
|