共计 2164 个字符,预计需要花费 6 分钟才能阅读完成。
这期内容当中丸趣 TV 小编将会给大家带来有关 SQL Server 中怎么实现高效分页,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
ROW_NUMBER 的含义及语法定义
ROW_NUMBER 实现对结果集的输出进行编号。具体来说,返回结果集分区内行的序列号,每个分区的 *** 行从 1 开始。
ROW_NUMBER () OVER ( [ PARTITION BY 字段 ,] order_by_clause )PARTITION BY: 将 FROM 子句生成的结果集划分为应用 ROW_NUMBER 函数的分区。value_expression 指定对结果集进行分区所依据的列。如果未指定 PARTITION BY,则此函数将查询结果集的所有行视为单个组。order_by_clause: 子句可确定在特定分区中为行分配 *** ROW_NUMBER 的顺序。order by 子句是必选项。返回值:bigint。结果集分区内行的序列号。offset 的含义及语法定义
offset 是 order by 的子句,主要用来限定返回的行数,用来做分页也是很合适的。只是从 MSSQL2012 才开始支持。语法结构如下:
FETCH { NEXT } { integer_constant | fetch_row_count_expression } { ROWS } ONLY
fetch_row_count_expression 可以是变量、参数或常量标量子查询。在使用子查询时,它无法引用在外部查询范围中定义的任何列。也就是说,它无法与外部查询相关联。
结合到分页,语法语法:
offset startPage rows fetch next pageSize rows only
其中起始页面:startPage=(@page-1)*@rows,页面大小:pageSize=@rows
演示数据准备
为了说明方便,我们准备一些演示数据,这是一个简单的业务销售表,字段只有业务员、销售区域和销售额,如下:
declare @sale table( FName nvarchar(50), FDistrict nvarchar(50), FAmount decimal(28,10) ); insert into @sale values (张三 , 北京 ,20000), (张三 , 上海 ,50000), (张三 , 深圳 ,40000), (张三 , 广州 ,30000), (李四 , 北京 ,30000), (李四 , 上海 ,50000), (李四 , 深圳 ,40000), (李四 , 广州 ,10000), (王二 , 北京 ,70000), (王二 , 上海 ,10000), (王二 , 深圳 ,60000), (王二 , 广州 ,20000), (马六 , 北京 ,80000), (马六 , 上海 ,20000), (马六 , 深圳 ,70000), (马六 , 广州 ,60000)
准备演示数据
使用 ROW_NUMBER 分页
比如我们希望按照业务员 + 销售区域排序后,每 4 条记录一页显示,写法如下:
declare @pagesize int =4;-- 每页记录数 declare @pagenum int =1;-- 第几页 select v.* from (select row_number() over(order by FName,FDistrict) as FRowIndex,* from @sale) as v where v.FRowIndex between @pagesize*(@pagenum-1)+1 and @pagenum*@pagesize;
分页查询
ROW_NUMBER 函数在 SQL 中属于热名称 (即刚定的名称 FRowIndex),只可以出现在 select 子句中,需要放在子查询中。也可以先对子查询做好定义后面再直接引用,语法如下:
declare @pagesize int =4;-- 每页记录数 declare @pagenum int =1;-- 第几页 with saledata as ( select row_number() over(order by FName,FDistrict) as FRowIndex,* from @sale ) select * from saledata where FRowIndex between @pagesize*(@pagenum-1)+1 and @pagenum*@pagesize;
分页查询
ROW_NUMBER 来做分页查询,经过反复应用测试,效率还是很高的。完整的测试脚本参看下图:
使用 OFFSET 实现分页
重复的代码部分不再赘述,在查询时要注意,offset 是 Order By 的子句,不能独立存在。语法结构如下:
select * from @sale order by FName,FDistrict offset (@pagenum-1)*@pagesize rows fetch next @pagesize rows only
返回的结果与使用 row_number 是一致的。完整的测试脚本参看下图:
上述就是丸趣 TV 小编为大家分享的 SQL Server 中怎么实现高效分页了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。