sqlServer实现分页查询的三种方式(sql分页查询怎么实现)这样也行?

随心笔谈2年前发布 admin
204 0 0

文章摘要

这篇文章介绍了SQL Server实现分页查询的三种主要方法,分别是从偏移量和页数控制(offset/fetch next)、利用最大主键值(max)、以及使用row_number()窗口函数。 1. **offset/fetch next** 这种方法通过指定偏移量和页数来实现分页,适用于不需要排序的情况。公式如下: ```sql select * from 表名 order by 主键 or 其他索引列 offset ((@pageIndex-1)*@pageSize) rows fetch next @pageSize rows only; ``` 示例中,通过偏移10行并 FETCH 下10行,即可获取第2页数据。这种方法简单直观,但需注意排序可能会影响性能。 2. **利用max(主键)** 通过两次查询实现分页,先筛选出前N行,再根据最大值条件筛选所需数据。虽然准确,但效率较低,尤其在大数据量时。公式和示例展示了如何通过窗口函数和条件筛选。 3. **利用row_number()** 通过窗口函数为每行生成行号,然后限制行号范围,实现分页。优化版本通过子查询限制查询范围,提高效率。这种方法在大数据量时表现更好,但需确保内层查询避免全表扫描。 文章还提到,row_number()的优化版本通过子查询限制返回行数,从而提高效率。这种方法在大数据量时表现更好。 总结来说, article provides a detailed comparison of three methods for implementing pagination in SQL Server, highlighting their strengths and weaknesses, and offering optimization strategies. For more information, you can refer to additional articles or explore further.



目录一、offset /fetch next关键字二、利用max(主键)三、利用row_number关键字总结

sqlServer的分页查询和mysql语句不一样,有三种实现方式。分别是:offset /fetch next、利用max(主键)、利用row_number关键字

2012版本及以上才有,SQL server公司升级后推出的新方法。

公式:

— 分页查询公式-offset /fetch next
select * from 表名
order by 主键 或 其他索引列
— @pageIndex:页码、@pageSize:每页记录数
offset ((@pageIndex-1)*@pageSize) rows
fetch next @pageSize rows only;

示例:

— 分页查询第2页,每页有10条记录
select * from tb_user
order by uid
offset 10 rows
fetch next 10 rows only ;

说明:

offset 10 rows ,将前10条记录舍去,fetch next 10 rows only ,向后再读取10条数据。

公式:

— 分页查询公式-利用max(主键)
select top @pageSize *
from 表名
where 主键>=(select max(主键)
from (
select top ((@pageIndex-1)*@pageSize+1) 主键
from 表名
order by 主键 asc) temp_max_ids)
order by 主键;

示例:

— 分页查询第2页,每页有10条记录
select top 10 *
from tb_user
— 3、再重新在这个表查询前10条,条件: id>=max(id)
where uid>=– 2、利用max(id)得到前11条记录中最大的id
(select max(uid)
from (
— 1、先top前11条行记录
select top 11 uid
from tb_user
order by uid asc) temp_max_ids)
order by uid;

说明:

先top前11条行记录,然后利用max(id)得到最大的id,之后再重新在这个表查询前10条,不过要加上条件,where id>=max(id)。

中心思想:其实就是先得到该页的初始id,PS:别忘了加上排序哦

这种方式也是比较常用的,直接利用row_number() over(order by id)函数计算出行数,选定相应行数返回即可,不过该关键字只有在SQL server 2005版本以上才有。

公式:

— 分页查询公式-row_number()
select top @pageSize *
from (
— rownumber是别名,可按自己习惯取
select row_number() over(order by 主键 asc) as rownumber,*
from 表名) temp_row
where rownumber>((@pageIndex-1)*@pageSize);

示例:

— 分页查询第2页,每页有10条记录
select top 10 *
from (
— 子查询,多加一个rownumber列返回
select row_number() over(order by uid asc) as rownumber,*
from tb_user) temp_row
–限制起始行标
where rownumber>10;

说明:

利用row_number函数给每行记录标了一个序号,相当于在原表中多加了1列返回。

上述示例,是以序号11为起始行,查询前10条记录,即为第2页数据。

优化:

可以看到,子查询查询了全表数据,如果数据量大,效率是比较低的。

下面是优化后的SQL,

公式:

— 分页查询公式-row_number()-优化版本
select *
from (
— rownumber是别名,可按自己习惯取
select top (@pageIndex*@pageSize) row_number() over(order by 主键 asc)
as rownumber,*
from 表名) temp_row
where rownumber>((@pageIndex-1)*@pageSize);

示例:

— 分页查询第2页,每页有10条记录
select *
from (
— 子查询,限制了返回前20条数据
select top 20 row_number() over(order by uid asc) as rownumber,*
from tb_user) temp_row
–限制起始行标
where rownumber>10;

说明:

这里,子查询仅查询到当前页的最后一行,没有进行全表查询,所以效率上要快一点。在外层限制起始行标,是没变的,但是却在内层控制了结尾行标。

上述示例,是以序号11为起始行,查询20以内的记录,即为第2页数据。

更多介绍,可查看我的另外篇文章:SQL Server中row_number函数用法介绍

到此这篇关于sqlServer实现分页查询的三种方式的文章就介绍到这了,更多相关sqlServer分页查询实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:高效的SQLSERVER分页查询(推荐)oracle,mysql,SqlServer三种数据库的分页查询的实例真正高效的SQLSERVER分页查询(多种方案)sqlserver分页查询处理方法小结

© 版权声明

相关文章