04.关于SqlServer查询,数据较多时分页查询同时获取总条数

在做的这个项目要做一个查询相关信息的功能,查询的Sql找到后,去SqlServer查了一下,发现有几千条数据

然后想到以前用的一个 limit 来做分页查询,发现 limit 是MySql里面的,SqlServer里面没有

然后就去网上搜了下关于SqlServer分页查询的知识,找了几个文章看了一下,好像都是嵌套查询来做的

然后选了一个文章,按照里面的方法去试一下,原文:高效的SQLSERVER分页查询 

这里我选了第五种方法去试了下

SELECT w2.n, w1.* FROM ARTICLE w1, 
 (SELECT TOP 50030 row_number() OVER (ORDER BY YEAR DESC, ID DESC) n, ID FROM ARTICLE ) w2
WHERE w1.ID = w2.ID AND w2.n > 50000 ORDER BY w2.n ASC 

发现了一个之前没有见过的 row_number() 函数,然后查了一下,大致就是对查询的结果重新进行一个编号

想要了解更多,可以点击这里 ROW_NUMBER 

然后我在本地新建了一个测试用的数据表,改了一下Sql查询

SELECT w2.n, w1.* FROM users w1, 
(SELECT TOP 20 row_number() OVER (ORDER BY  ID) n, ID FROM users ) w2 
WHERE w1.ID = w2.ID AND w2.n > 10 ORDER BY w2.n ASC;

04.关于SqlServer查询,数据较多时分页查询同时获取总条数_第1张图片

其中id是表的主键,n是row_number()重新生成的编号值,因为按照id排序的,所以和id一样

这条Sql是查询第11条到20条的数据,w2取的就是按照id排序的前20条结果(这里w2的内容是 n, ID)

其中id与w1原表连接查询,按照w2.n排序,从n > 10也就是11条开始取值

结果就是,按照ID排序,取前20条数据,从第11条开始,完成取第11到20条数据

理解了以后,那么改动一下数字,就可以完成从x条到y条的查询,然后重新改了一下

declare @size int set @size=10
declare @page int set @page=2

SELECT w2.n, w1.* FROM users w1, 
(SELECT TOP (@size*@page) row_number() OVER (ORDER BY  ID DESC) n, ID FROM users ) w2 
WHERE w1.ID = w2.ID AND w2.n > ((@page-1) * @size) ORDER BY w2.n ASC;

声明每页条数和当前页,(2*10)  即查询前20条数据,n > ((2-1)*10=10) 即第11条开始,查询结果如下(改了按照id降序)

04.关于SqlServer查询,数据较多时分页查询同时获取总条数_第2张图片

这样就可通过赋值给变量@size 和 @page 来控制查询

然后修改好以后,前端也可以显示了,然后又遇到一个问题就是不知道一共有多少条数据

然后又去查了一下,看到一篇文章有两种方法,原文:SQL Server 怎么在分页获取数据的同时获取到总记录数 

1.先分页获取数据,然后再查询一遍数据库获取到总数量

2.使用count(1) over()获取总记录数量

然后选了第二种方法,虽然会有一整列的总条数,但不用再查询一遍数据库了,然后放在内层查询中,如下

declare @size int set @size=10
declare @page int set @page=1

SELECT w2.allcount,w2.n, w1.* FROM users w1, 
(SELECT TOP (@size*@page) row_number() OVER (ORDER BY  ID DESC) n, 
    ID,COUNT(1) OVER() AS allcount FROM users ) w2 
WHERE w1.ID = w2.ID AND w2.n > ((@page-1) * @size) ORDER BY w2.n ASC;

04.关于SqlServer查询,数据较多时分页查询同时获取总条数_第3张图片

至此,分页查询和总条数查询都完成了

又学到了新知识,今天又是元气满满的一天鸭

你可能感兴趣的:(Sql学习)