SQL数据分页查询的方法

最近学习了一下SQL的分页查询,总结了以下几种方法。

首先建立了一个表,随意插入的一些测试数据,表结构和数据如下图:

现在假设我们要做的是每页5条数据,而现在我们要取第三页的数据。(数据太少,就每页5条了)

方法一:

select top 5 * from [StuDB].[dbo].[ScoreInfo] where [SID] not in (select top 10 [SID] from [StuDB].[dbo].[ScoreInfo] order by [SID]) order by [SID]

结果:

此方法是先取出前10条的SID(前两页),排除前10条数据的SID,然后在剩下的数据里面取出前5条数据。

缺点就是它会遍历表中所有数据两次,数据量大时性能不好。

方法二:

select top 5 * from [StuDB].[dbo].[ScoreInfo] where [SID]> (select MAX(t.[SID]) from (select top 10 [SID] from [StuDB].[dbo].[ScoreInfo] order by [SID]) t ) order by [SID]

结果:

此方法是先取出前10条数据的SID,然后取出SID的最大值,再从数据里面取出 大于 前10条SID的最大值 的前5条数据。

缺点是性能比较差,和方法一大同小异。

方法三:

select * from (select *,ROW_NUMBER() over(order by [SID]) ROW_ID from [StuDB].[dbo].[ScoreInfo]) t where t.[SID] between (5*(3-1)+1) and 5*3

结果:

此方法的特点就是使用 ROW_NUMBER() 函数,这个方法性能比前两种方法要好,只会遍历一次所有的数据。适用于Sql Server 2000之后的版本(不含)。

方法四:

select * from [StuDB].[dbo].[ScoreInfo] order by [SID] offset 5*2 rows fetch next 5 rows only

结果:

此方法适用于Sql Server 2008之后的版本(不含)。

offset 10 rows fetch next 5 rows only 这句代码我的理解是:跳过前面10条数据(前2页)从下一条开始取5条数据。

个人感觉这个方法比使用 ROW_NUMBER() 函数的方法要好(从代码方面来看,代码也少很多),至于性能方面没有做过测试,就不说了。

不过,最后两种方法的性能肯定是远超前面两种方法的,具体的还是看实用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-12 03:41:43

SQL数据分页查询的方法的相关文章

SQL数据分页查询的方法_MsSql

最近学习了一下SQL的分页查询,总结了以下几种方法. 首先建立了一个表,随意插入的一些测试数据,表结构和数据如下图: 现在假设我们要做的是每页5条数据,而现在我们要取第三页的数据.(数据太少,就每页5条了) 方法一: select top 5 * from [StuDB].[dbo].[ScoreInfo] where [SID] not in (select top 10 [SID] from [StuDB].[dbo].[ScoreInfo] order by [SID]) order by

ThinkPHP3.1 数据分页查询实现方法

我们首先在数据库里面创建一个think_data数据表用于测试:  代码如下 复制代码     CREATE TABLE IF NOT EXISTS `think_data` (      `id` smallint(4) unsigned NOT NULL AUTO_INCREMENT,       `title` varchar(255) NOT NULL,       `content` varchar(255) NOT NULL,       `create_time` int(11)

Mybatis实现增删改查及分页查询的方法_java

MyBatis的前身就是iBatis.是一个数据持久层(ORM)框架. MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持 久层框架.MyBatis消除了几乎所有的JDBC 代码和参数的手工 设置以及结果集的检索.MyBatis使用简单的XML或注解用于 配置和原始映射,将接口和Java 的POJOs(Plan Old Java Objects,普通的Java 对象)映射成数据库中的记录.每个 MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个 SqlS

五种SQL Server分页存储过程的方法及性能比较_MsSql

在SQL Server数据库操作中,我们常常会用到存储过程对实现对查询的数据的分页处理,以方便浏览者的浏览.本文我们总结了五种SQL Server分页存储过程的方法,并对其性能进行了比较,接下来就让我们来一起了解一下这一过程. 创建数据库data_Test : create database data_Test GO use data_Test GO create table tb_TestTable --创建表 ( id int identity(1,1) primary key, userN

[SQL]学习一下sql数据分页

今天写点啥呢?就数据分页吧.同事说你直接将所有数据库中的数据都返回给我好了,我一并处理.但我说还好现在就几十条测试数据的,如果说是上万条,几十万条数据,我一下子查询数据库都打包发给你,你还要解析,那客户点击了个查询按钮,按照这样做要等到猴年马月,所以说,服务器端只能一点一点的返回给你才是最佳解决方案! sql数据分页有几种方法,首先用最简单最原始的方法,选择top10: select top 10 * from Student where id not in(select top(10*@pag

sqlserver分页查询处理方法小结

sqlserver2008不支持关键字limit ,所以它的分页sql查询语句将不能用MySQL的方式进行,幸好sqlserver2008提供了top,rownumber等关键字,这样就能通过这几个关键字实现分页. 下面是本人在网上查阅到的几种查询脚本的写法: 几种sqlserver2008高效分页sql查询语句 top方案: sql code: select top 10 * from table1 where id not in(select top 开始的位置 id from table1

五种SQL Server分页存储过程的方法及性能比较

在SQL Server数据库操作中,我们常常会用到存储过程对实现对查询的数据的分页处理,以方便浏览者的浏览.本文我们总结了五种SQL Server分页存储过程的方法,并对其性能进行了比较,接下来就让我们来一起了解一下这一过程. 创建数据库data_Test : create database data_Test GO use data_Test GO create table tb_TestTable --创建表 ( id int identity(1,1) primary key, userN

JDBC使用游标实现分页查询的方法_java

本文实例讲述了JDBC使用游标实现分页查询的方法.分享给大家供大家参考,具体如下: /** * 一次只从数据库中查询最大maxCount条记录 * @param sql 传入的sql语句 * @param startNo 从哪一条记录开始 * @param maxCount 总共取多少条记录 */ public void getData(String sql,int startNo,int maxCount){ Connection conn = ConnectionUtil.getConnec

Mysql 导入.sql数据实现几种方法

mysql教程 导入.sql数据实现几种方法 方法如下: 1. 先用jive用户连接: e:mysqlbin>mysql -u jive -p jive 2. 再运行如下命令: mysql> . f:workingfolderjivejdondatabasejive_mysql.sql   我的个人实践是:php教程myadmin 导出 utf-8 的 insert 模式的 abc.sql ftp abc.sql 到服务器 ssh 到服务器 mysql -u abc -p use kkk(数据