1、MySQL的实现:使用limit语句来实现
注意mysql中的记录是从0开始编号的:
1)查询从第1000到1005条的记录:select * from table_name limit 999,5;
2)查询前10条记录:select * from table_name limit 10;等价于:select * from table_name limit 0,10;
2)查询从第100条记录开始到表的最后一条记录:select * from table_name limit 99 -l;mysql提供-L的参数,表示到表的最后一条记录
2、 Oracle中的实现:使用rownum的关键字来实现
1)查询表中的前8条记录:select * from area where rownum <= 8
2)查询第2到第8条记录:必须使用子查询或者是集合操作来实现:有三种方法:
A、select id,province,city,district from (select id,province,city,district,rownum as num from area) where num between 2 and 8;
首先根据select id,province,city,district,rownum as num from area得到一个临时表,这个临时表中有一个rownum列(一个伪列,类似与rowid,但又不同于rowid,因为rowid是物理存在的一个列,也就是说Oracle数据库中任何一个表都有一个rowid列,而rownum不是物理存在的),然后在临时表中来查询。
B、select * from area where rownum <= 8 minus select * from area where rownum < 2;
使用集合减运算符minus,该操作返回在第一个select中出现而不在第二个select中出现的记录。
C、select id,province,city,district from (select id,province,city,district,rownum as num from area) where num >=2
intersect
select * from area where rownum <= 8;
使用集合交运算符intersect,这里绕了一个弯(不过这个弯实现了rownum大于某个数的查询),它是首先利用A的方式查询得到所有rownum大于2的记录,然后再与rownum小于等于8的记录集合做交运算。三种操作得到的结果一样。
3、rownum需要注意的问题
[1] rownum不支持以下方式的查询
a: select * from area where rownum > 2;
b: select * from area where rownum = n; --where n is a integer number lager than 1
注:rownum只支持select * from area where rownum =1的查询。
因为rownum是根据查询的结果集来对记录进行编号,所以当你查询rownum大于2的记录时会得到一个空的结果集。因为当oracle查询得到第1条记录时,发现rownum为1不满足条件,然后就继续查询第2条记录,但此时第2条记录又被编号为1(也即rownum变为1),所以查询得到的始终是rownum=1,因此无法满足约束,最终查询的结果集为空。
[2] rownum的排序查询问题
Rownum的排序查询是根据表中数据的初始顺序来进行的。
a: select * from area where rownum <= 8 order by district;只对表中的前8条记录进行排序
b: 如果我要取表中的前8条记录并且要求是全表有序:select * from (select * from area order by district)
where rownum <= 8;
浙公网安备 33010602011771号