1、Oracle 分页
第一种:利用分析函数row_number() 方法
SELECT *FROM ( select t.*, row_number () over (ORDER BY t1.id) rowno FROM TABLE1 ) where rowno BETWEEN 21AND 40;
第二种:直接使用rownum 虚列(推荐)
SELECT *FROM ( SELECT t.*, rownum AS rowno FROM TABLE1 )WHERE rowno BETWEEN 10AND 20
第三种:不使用between and 进行分页
SELECT * FROM
(SELECT A.* , rownum r
FROM
(SELECT * FROM msr_topic
Where name like %hr%
) A
WHERE rownum <= indexEnd
) B
WHERE r > indexStart;
总结:显然第二种方法比较好,第三种方法最差!因为不用order by语句,会提高检索数据的速度的,尤其数据量越大时,第二种方法快速检索数据越明显。oracle中慎用带有order by的分页。尤其是在oracle10g中,会出现会引起混乱,即相同记录会出现在不同页中。
2、SqlServer 分页
第一种方法:通过TOP函数来实现(推荐)
SELECT TOP 10 * FROM TestTable WHERE ( id NOT IN ( SELECT TOP 20 * FROM TestTable ORDER BY id ) ) ORDER BY ID
第二种方法:通过Max函数来实现
select top limit * from table1 where id > ( select max (id) from ( select top ((page - 1) * LIMIT) id from table1 order by id ) as T )ORDER BY id
第三种方法:通过 ROW_NUMBER 函数+Top 来实现
SELECT TOPLIMIT * FROM ( SELECT top LIMIT ROW_NUMBER () OVER (ORDER BY ReportID) AS RowNo FROM TABLE) AS AWHERE RowNo > page * 10
第四种方法:通过 ROW_NUMBER 函数+Between And 来实现
select * from (select * ROW_NUMBER( )over( order by u_id ) as row_id from users where u_name like %hr% ) as temp_usersWhere row_id between ${start} and ${end}总结:
1)第一种方法有一个致命的缺点,就是它含有NOT IN字样,要换成用not exists来代替not in;
2)第二种方法注意ID必须唯一,不能使用复合主键,而且主键也必须是有规律的数字,否则无法比较
3)第三种方法ROW_NUMBER() 就是生成一个顺序的行号,而他生成顺序的标准,就是后面紧跟的OVER(ORDER BY ReportID),其中ReportID可以是联合主键。不用说 自带函数时最差的,不要使用这种方式。
4)与第三种方式一样,效率低下
3、mysql分页
select * from table limit start , size
4、PostgreSQL 分页
select * from table limit size offset start
参考: