(1)MySql的Limit m,n语句
Limit后的两个参数中,参数m是起始下标,它从0开始;参数n是返回的记录数。我们需要分页的话指定这两个值即可。
比如:查询10行记录,起始行从3开始
SELECT * FROM emp LIMIT 3, 10;
(2)Oracle数据库的分页需要用到rownum
rownum伪列
rownum伪列是Oracle首先进行查询获取到结果集之后在加上去的一个伪列,这个伪列对符合条件的结果添加一个从1开始的序列号,先看一个例子:
select rownum,e.* from emp e;
查询前10条记录,我们可以这么写;
select rownum,e.* from emp e where rownum <=10;
于是根据rownum,这个时候我们产生了分页的一个想法,取6~10条记录:
select rownum,e.* from emp e where rownum >5 and rownum <=10;
但是我们发现这行不通,那么怎么会出现这个情况呢?原因在于,当生成结果集时,rownum每次都是从1开始产生,但是我们的条件里rownum>5,导致这条记录被过滤,这样再次次产生的rownum都是1,再次过滤,以此一直持续下去。
那么怎么实现分页呢?重要之处在于:
子查询里固定表里面数据的记录编号,外层查询过滤子查询里面固定的记录编号就可以实现Oracle分页!
select * from (select rownum rn,e.* from emp e where rownum <=10 ) e1 where rn>6;
如果我们要对emp表中的列sal进行排序,再分页,我们可以这样写。
select *
from (select rownum r,e1.* from (select * from emp order by sal) e1 where rownum <=8 ) where r >=5;