sql分页查询多种方式,sql分页代码多种方法

发布时间:2020-12-23编辑:脚本学堂
有关sql分页查询的多种方式,sql分页代码的几种实现方案,比如mysql的limit,oracle的rownum和row_number(),sqlserver的top和row_number(),需要的朋友参考下。

sql分页查询语句(分页的几种方式与优缺点)

分页,就是在满足条件的一堆有序数据中截取当前所需要展示的那部分。
实际上各种数据库都考虑到分页问题而内置了一些策略,比如mysql的limit,oracle的rownum和row_number(),sqlserver的top和row_number(),基于此可以得到一些分页代码的方法。

1、 基于mysql的limit和oracle的rownum,可以直接限制返回区间,以下以limit为例(使用rownum时注意子查询):

方法一、直接限制返回区间
select * from table where 查询条件 order by 排序条件 limit ((页码-1)*页大小),页大小;

优点:写法简单。
缺点:当页码和页大小过大时,性能明显下降。
适用:数据量不大。

2、基于limit(mysql)、rownum(oracle)和top(sqlserver),他们可以限制返回的行数,因此可以得到以下两套通用的方法(以sqlserver为例):

方法二、not in
 

复制代码 代码示例:
select top 页大小 * from table where 主键 not in
(
  select top (页码-1)*页大小 主键 from table where 查询条件 order by 排序条件
)
order by 排序条件

优点:通用性强。
缺点:当数据量较大时向后翻页,not in中的数据过大会影响性能。
适用:数据量不大。

方法三、max
 

复制代码 代码示例:
select top 页大小 * from table where 查询条件 and id >
(
  select isnull(max(id),0) from
  (
    select top ((页码-1)*页大小) id from table where 查询条件 order by id
) as temptable
)
order by id

优点:速度快,特别是当id为主键时。
缺点:适用面窄,要求排序条件单一且可比较。
适用:简单排序(特殊情况也可尝试转换成类似可比较值处理)。

3、基于sqlserver和oracle的row_number(),可以得到返回数据的行号,基于此在限制返回区间得到如下方法(以sqlserver为例):

方法四、row_number()
 

复制代码 代码示例:
select top 页大小 * from
(
  select top (页码*页大小) row_number() over (order by 排序条件) as rownum, * from table where 查询条件
) as temptable
where rownum between (页码-1)*页大小+1 and 页码*页大小
order by rownum

优点:在数据量较大时相比not in有优势。
缺点:小数据量时效率不如not in方便。
适用:大部分分页查询需求。