码迷,mamicode.com
首页 > 数据库 > 详细

常用数据库分页

时间:2015-05-03 00:54:37      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!