搜索
首页数据库SQLSQL server分页方法有哪些

这篇讲的是SQL server的分页方法,用的SQL server 2012版本。下面都用pageIndex表示页数,pageSize表示一页包含的记录。并且下面涉及到具体例子的,设定查询第2页,每页含10条记录。

首先说一下SQL server的分页与MySQL的分页的不同,mysql的分页直接是用limit (pageIndex-1),pageSize就可以完成,但是SQL server 并没有limit关键字,只有类似limit的top关键字。所以分页起来比较麻烦。

  SQL server分页我所知道的就只有四种:三重循环;利用max(主键);利用row_number关键字,offset/fetch next关键字(是通过搜集网上的其他人的方法总结的,应该目前只有这四种方法的思路,其他方法都是基于此变形的)。

要查询的学生表的部分记录

这里写图片描述

方法一:三重循环

思路

  先取前20页,然后倒序,取倒序后前10条记录,这样就能得到分页所需要的数据,不过顺序反了,之后可以将再倒序回来,也可以不再排序了,直接交给前端排序。

  还有一种方法也算是属于这种类型的,这里就不放代码出来了,只讲一下思路,就是先查询出前10条记录,然后用not in排除了这10条,再查询。

代码实现

-- 设置执行时间开始,用来查看性能的
set statistics time on ;
-- 分页查询(通用型)
select * 
from (select top pageSize * 
from (select top (pageIndex*pageSize) * 
from student 
order by sNo asc ) -- 其中里面这层,必须指定按照升序排序,省略的话,查询出的结果是错误的。
as temp_sum_student 
order by sNo desc ) temp_order
order by sNo asc

-- 分页查询第2页,每页有10条记录
select * 
from (select top 10 * 
from (select top 20 * 
from student 
order by sNo asc ) -- 其中里面这层,必须指定按照升序排序,省略的话,查询出的结果是错误的。
as temp_sum_student 
order by sNo desc ) temp_order
order by sNo asc
;

查询出的结果及时间

这里写图片描述

这里写图片描述

方法二:利用max(主键)

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

代码实现

set statistics time on;
-- 分页查询(通用型)
select top pageSize * 
from student 
where sNo>=
(select max(sNo) 
from (select top ((pageIndex-1)*pageSize+1) sNo
from student 
order by  sNo asc) temp_max_ids) 
order by sNo;


-- 分页查询第2页,每页有10条记录
select top 10 * 
from student 
where sNo>=
(select max(sNo) 
from (select top 11 sNo
from student 
order by  sNo asc) temp_max_ids) 
order by sNo;

查询出的结果及时间

图片

这里写图片描述

方法三:利用row_number关键字

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

SQL实现

set statistics time on;
-- 分页查询(通用型)
select top pageSize * 
from (select row_number() 
over(order by sno asc) as rownumber,* 
from student) temp_row
where rownumber>((pageIndex-1)*pageSize);

set statistics time on;
-- 分页查询第2页,每页有10条记录
select top 10 * 
from (select row_number() 
over(order by sno asc) as rownumber,* 
from student) temp_row
where rownumber>10;

查询出的结果及时间

图片

这里写图片描述

第四种方法:offset /fetch next(2012版本及以上才有)

代码实现

set statistics time on;
-- 分页查询(通用型)
select * from student
order by sno 
offset ((@pageIndex-1)*@pageSize) rows
fetch next @pageSize rows only;

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

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

结果及运行时间

这里写图片描述

这里写图片描述

封装的存储过程

最后,我封装了一个分页的存储过程,方便大家调用,这样到时候写分页的时候,直接调用这个存储过程就可以了。

分页的存储过程

create procedure paging_procedure
(	@pageIndex int, -- 第几页
	@pageSize int  -- 每页包含的记录数
)
as
begin 
	select top (select @pageSize) *     -- 这里注意一下,不能直接把变量放在这里,要用select
	from (select row_number() over(order by sno) as rownumber,* 
			from student) temp_row 
	where rownumber>(@pageIndex-1)*@pageSize;
end

-- 到时候直接调用就可以了,执行如下的语句进行调用分页的存储过程
exec paging_procedure @pageIndex=2,@pageSize=10;

总结

  根据以上四种分页的方法执行的时间可以知道,以上四种分页方法中,第二,第三,第三四种方法性能是差不多的,但是第一种性能很差,不推荐使用。还有就是这篇博客这是测试了小量数据,还没有分页大量数据,所以不清楚在大量数据要分页时哪种方法的性能更加好。我这里推荐第四种,毕竟第四种是SQL server公司升级后推出的新方法,所以应该理论上性能和可读性都会更加好。

相关推荐:《mysql教程

以上是SQL server分页方法有哪些的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:CSDN。如有侵权,请联系admin@php.cn删除
MySQL:SQL的特定实现MySQL:SQL的特定实现Apr 13, 2025 am 12:02 AM

MySQL是开源的关系型数据库管理系统,提供了标准SQL功能和扩展。1)MySQL支持标准SQL操作如CREATE、INSERT、UPDATE、DELETE,并扩展了LIMIT子句。2)它使用InnoDB和MyISAM等存储引擎,适用于不同场景。3)用户可以通过创建表、插入数据和使用存储过程等高级功能高效使用MySQL。

SQL:使所有人都可以访问数据管理SQL:使所有人都可以访问数据管理Apr 12, 2025 am 12:14 AM

sqlmakesdatamanagectAccessibletoAllbyProvidingAsimpleyetpoperfultoolSetSetForQuerquereingAndManagingDatabases.1)ItworkswithrelationalDatabases,允许inserstospecefifywhattheywanttododowithththedata.2)

SQL索引策略:通过数量级提高查询性能SQL索引策略:通过数量级提高查询性能Apr 11, 2025 am 12:04 AM

SQL索引可以通过巧妙的设计显着提升查询性能。 1.选择合适的索引类型,如B-tree、哈希或全文索引。 2.使用复合索引优化多字段查询。 3.避免过度索引以减少数据维护开销。 4.定期维护索引,包括重建和移除不必要的索引。

sql怎么删除约束sql怎么删除约束Apr 10, 2025 pm 12:21 PM

在 SQL 中删除约束,请执行以下步骤:识别要删除的约束名称;使用 ALTER TABLE 语句:ALTER TABLE 表名 DROP CONSTRAINT 约束名;确认删除。

sql触发器怎么设置sql触发器怎么设置Apr 10, 2025 pm 12:18 PM

SQL 触发器是一种在指定表上执行特定事件时自动执行特定操作的数据库对象。要设置 SQL 触发器,可以使用 CREATE TRIGGER 语句,其中包括触发器名称、表名称、事件类型和触发器代码。触发器代码使用 AS 关键字进行定义,并包含 SQL 或 PL/SQL 语句或块。通过指定触发器条件,可以使用 WHERE 子句限制触发器的执行范围。可以使用 INSERT INTO、UPDATE 或 DELETE 语句在触发器代码中执行触发器操作。NEW 和 OLD 关键字可以在触发器代码中用来引用受影

sql查询怎么加索引sql查询怎么加索引Apr 10, 2025 pm 12:15 PM

索引是一种通过排序数据列来加速数据查找的数据结构。为 SQL 查询添加索引的步骤如下:确定需要索引的列。选择合适的索引类型(B 树、哈希或位图)。使用 CREATE INDEX 命令创建索引。定期重建或重新组织索引以维护其效率。添加索引的好处包括提高查询性能、减少 I/O 操作、优化排序和筛选以及提高并发性。当查询经常使用特定列、返回大量数据需要排序或分组、涉及多个表或数据库表较大时,应该考虑添加索引。

sql语句ifelse怎么用sql语句ifelse怎么用Apr 10, 2025 pm 12:12 PM

IFELSE 语句是一种条件语句,用于根据条件评估结果返回不同值。其语法结构为:IF (condition) THEN return_value_if_condition_is_true ELSE return_value_if_condition_is_false END IF;。

sql数据库错误怎么查看sql数据库错误怎么查看Apr 10, 2025 pm 12:09 PM

SQL数据库错误查看方法有:1. 直接查看错误消息;2. 使用SHOW ERRORS和SHOW WARNINGS命令;3. 访问错误日志;4. 使用错误代码查找错误原因;5. 检查数据库连接和查询语法;6. 使用调试工具。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用