标签:
1、Oracle 分页
第一种:利用分析函数row_number() 方法
select * from(
select t.*,row_number() over (order by t1.id) rowno from TABLE1
)
where rowno between 21 and 40;
第二种:直接使用rownum 虚列(推荐)
select * from
(select t.*,rownum as rowno from TABLE1 )
where rowno between 10 and 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 TOP limit *
FROM
(
SELECT top limit ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo
FROM TABLE
) AS A
WHERE 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_users Where 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
参考:
很多博客........
标签:
原文地址:http://my.oschina.net/heweipo/blog/409166