如何将数据库中查询出来的数据再进行分页操作?


我之前写过《如何在SQLServer查询中实现高效分页》专门讲述分页的,现摘录部分,希望可以解决问题。


从MSSQL2005开始,SQL Server提供了一个内置函数ROW_NUMBER,这是一个非常神奇的函数。从MSSQL2012开始,SQL Server提供了offset方法进行分页。

今天我们就谈谈ROW_NUMBER和offset的语法和在分页中的应用。

ROW_NUMBER的含义及语法定义

ROW_NUMBER实现对结果集的输出进行编号。 具体来说,返回结果集分区内行的序列号,每个分区的第一行从 1 开始。

ROW_NUMBER ( ) OVER ( order_by_clause )
  • 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

演示数据准备

演示数据准备的代码我就不粘贴了,直接看下图:

使用ROW_NUMBER分页

比如我们希望按照业务员+销售区域排序后,每4条记录一页显示,语法如下:

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;

使用OFFSET实现分页

重复的代码部分不再赘述,在查询时要注意,offset是Order By的子句,不能独立存在。语法结构如下:

select * from @sale
order by FName,FDistrict
offset (@pagenum-1)*@pagesize rows fetch next @pagesize rows only

返回的结果与使用row_number是一致的。完整的测试脚本参看下图:

希望能解决题主所提的问题!


网云技术


“我是哟哟吼说科技,专注于数据网络的回答,欢迎大家与我交流数据网络的问题”

如题,如何将数据库查询出来的数据进行分页操作?

哟哟简单说一下分析及操作步骤:

1、创建一个page对象

a、创建所需要的属性,如当前的页码CurrentPage;

b、通过数据库查出得到数据的总和TotalConunt;

c、分析一共需要多少页TotalPage(所有数据的总和/CurrentCount,采用math.ceil()方法);

d、生成setter和getter方法;

2、servlet层调用service层的方法

a、创建一个service层的对象;

b、在service层创建findPageCategory方法,目的是为了获取跟分页有关的所有属性,如TotalPage,TotalCount等;

3、Dao层实现

a、查询数据库中所有数据的总和;

b、分页查询数据,即使用SQL聚合语句limit查询数据后第一个数据的起始位置,第二个参数表示每个分页查询的数据条数;

欢迎大家多多关注我,在下方评论区说出自己的见解。


哟哟吼说科技


这个太简单了,从数据库查询出来的数据一般是以list或者array的形式存在于内存中,那么我们可以直接对这个list进行遍历,找出我们所需“页”的数据即可啊。

代码示例(随手写的代码,请自己测试):

public List getListPage(List list, int pageNo, int pageSize) { if (list == null) {return null;} return list.subList((pageNo - 1) * pageSize, pageNo * pageSize);}

程序界一帅


limit (page-1)*pagesize,pagesie##mysql --oracle rownum三重查询排序分页


分享到:


相關文章: