MySQL ORACLE SQLServer分页
MySQL ORACLE SQLServer分页
lissownpro 发表于4个月前
MySQL ORACLE SQLServer分页
  • 发表于 4个月前
  • 阅读 8
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

物理分页与逻辑分页

  • 物理分页: 物理分页依赖的是某一物理实体,这个物理实体就是数据库,比如MySQL数据库提供了limit关键字,程序员只需要编写带有limit关键字的SQL语句,数据库返回的就是分页结果
  • 逻辑分页: 逻辑分页依赖的是程序员编写的代码。数据库返回的不是分页结果,而是全部数据,然后再由程序员通过代码获取分页数据,常用的操作是一次性从数据库中查询出全部数据并存储到List集合中,因为List集合有序,再根据索引获取指定范围的数据。

对比

1.数据库负担

物理分页每次都访问数据库,逻辑分页只访问一次数据库,物理分页对数据库造成的负担大。

2.服务器负担

逻辑分页一次性将数据读取到内存,占用了较大的内容空间,物理分页每次只读取一部分数据,占用内存空间较小。

3.实时性

逻辑分页一次性将数据读取到内存,数据发生改变,数据库的最新状态不能实时反映到操作中,实时性差。物理分页每次需要数据时都访问数据库,能够获取数据库的最新状态,实时性强。

4.适用场合

逻辑分页主要用于数据量不大、数据稳定的场合,物理分页主要用于数据量较大、更新频繁的场合。

Mysql分页

  • 语法:select * from table limit 0,5;或者select * from table limit 5;//取前五条记录
  • select * from table limit 10,5;//取10-15条记录

假如每页10条数据,可以采用下面语法

查询第1条到第10条的数据的sql是:select * from table limit 0,10;   ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;

查询第10条到第20条的数据的sql是:select * from table limit 10,20;  ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;

查询第20条到第30条的数据的sql是:select * from table limit 20,30;  ->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10

假如n为页码参数,select * from table limit(n-1)*10,10

Oracle分页

  • 语法:select * from where rownum<10;//查询前10条数据
  • select * from table where rownum>10 and rownum<=20;//查询10-20条数据

还是假如每10条为一页,n为页码

select * from table where rownum > (n-1)*10 and rownum <=n*10;

查询5000以后的五百条

  • select * from (select a.*, rownum as rnum from (select * from table) a where rownum <=5500) where rnum >= 5000;
  • select * from (select * from (select t.*, row_number() OVER(ORDER BY null) AS "row_number" from table t) p where p."row_number" > 5000) q where rownum <= 500;

第二种查询效率较高,耗时少,推荐第二种。

SQL Server分页

  • 先搜出id在1-40之间的数据,紧接着搜出id不在1-40之间的数据,最后将搜出的结果取前十条。
SELECT TOP 10           --3、最后再取出前10条数据,这就是数据库中第41-50条数据(注意,id不是41-50,因为我删除了id为44、45的记录)
        *
FROM    dbo.a
WHERE   id NOT IN (     --2、然后搜出id不在前40之内的其它数据
        SELECT TOP 40   --1、按照id排序之后先搜出前40条数据
                id 
        FROM    dbo.a
        ORDER BY id )
ORDER BY id;
  • 把表中的所有数据都按照一个rowNumber进行排序,然后查询rownuber大于40的前十条记录。
SELECT TOP 10
        *
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY id ) AS rownumber ,
                    *
          FROM      a
        ) A
WHERE   rownumber > 40;
  • 使用OFFSET是SQLServer2012新具有的分页功能,主要功能是从第x条数据开始共取y数据。但是其必须根再Order By
    后面使用,相比前三种方式更加方便。例如
select id from a Order by id Offset 0 Row Fetch Next 5 Rows Only.
标签: 数据库
共有 人打赏支持
粉丝 0
博文 30
码字总数 10829
×
lissownpro
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: