SQL--实现分页查询

       在查询数据中,对于某些数据量过大,为了减少页面上单页的加载时间,我们常常会选择分页查询,分页查询有很多方法,下面主要介绍两种分页方法。

    一. 通过主键来实现分页:

1.数据库背景. Person表,ID主键盘,自增1,varchar行Name.

    

     2.里面包含了10条数据。

3. 可以通过唯一ID,来进行分页.

Note:SELECT TOP((@PageIndex-1)*@PageSize) ID FROM Person 查询出前面所有的数据的ID. 然后父查询,通过NOT IN 将已经查询过的ID排除。

DECLARE @PageIndex int
DECLARE @PageSize int
SET @PageIndex=2
SET @PageSize=3
SELECT TOP(@PageSize) * FROM Person WITH(NOLOCK) WHERE ID NOT IN(SELECT TOP((@PageIndex-1)*@PageSize) ID FROM Person)

     二.通过row_number() 来实现分页查询 

1.不用主键也可以查询,通过row_number来为没一个查询的数据标记上行号,然后在所标记的行号上进行分组取行。

   

DECLARE @PageIndex int
DECLARE @PageSize int
SET @PageIndex=2
SET @PageSize=3
SELECT TOP(@PageSize) A.ID,A.Name FROM (SELECT row_number() over(order by id) as rownumber,* from Person WITH(NOLOCK)) A WHERE A.rownumber>((@PageIndex-1)*@PageSize)

   三.小Tips

1.起初在写博客的时候,其实还想过另一种方法,不防可以提出来,大家来看看这段SQL.

    

SELECT TOP(@PageSize) * FROM Person WHERE ID >(SELECT TOP((@PageIndex-1)*@PageSize) MAX(ID) FROM Person)

     2.下面是前面3个SQL执行的结果.

Note: 第三个sql是没有数据的。对于第三条sql,原理是先取出前面页数中最大的ID为maxID,然后取出ID大于MaxID的数据,取出前面的PageSize行,看起来的确没问题,可是最后一条数据都没有,这是为什么呢,问题出在了下面这半句Sql

    

SELECT TOP((@PageIndex-1)*@PageSize) MAX(ID) FROM Person

     Note:因为ID是主键自己增加,在调用MAX(ID)的是其实区的是当前最大的ID. (对于当前情况MAX(ID)始终是10,所以没数据)

      四.总结:

有关MAX(ID)还请了解这方面的解释一下为何是最大的ID.小弟也只是在写sql的时候发现的. 对原理不熟悉。求各位博友指点。

  

时间: 2024-08-10 19:09:13

SQL--实现分页查询的相关文章

[.NET] SQL数据分页查询

[.NET] SQL数据分页查询 程序下载 范例下载:点此下载 原始码下载:点此下载 NuGet封装:点此下载 数据查询 开发系统时,使用C#执行SQL查询指令,就可以从SQL数据库里查询所需数据. SELECT Id, Name FROM Users 数据分页查询 当数据量过多时,系统会需要采用分页的方式来分批取得数据.这时可以改写原有的SQL查询指令,在其中加入ROW_NUMBER(),来为每笔资料打上编号.后续依照系统需求,取得某个编号范围内的数据,就完成在系统中提供数据分页查询的功能.(

动态sql实现分页查询

1.创建实体类对象需要查询的条件com.rl.ecps.model.QueryCondition private Long brandId; private Short auditStatus; private Short showStatus; private String itemName; private Integer pageNo; private Integer startNum; private Integer endNum; 2.查询语句 查询条数: <select id="

SQL 存储过程 分页查询

ALTER PROCEDURE [dbo].[gzProc_TablePage] @tablename varchar(MAX),--表名 @selcolumn varchar(MAX),--查询字段 @where varchar(MAX),--where条件 @sortcolumn varchar(MAX),--排序字段 @pagecount int,--每页记录数 @pageindex int--页号ASBEGIN /*************************************

SQL Server 分页查询存储过程

1.低效的分页 SELECT TOP m-n+1 * FROM publish WHERE (id NOT IN (SELECT TOP n-1 id FROM publish)) 但这个存储过程有一个致命的缺点,就是它含有NOT IN字样.虽然我可以把它改造为: SELECT TOP 页大小 * FROM Table1 WHERE not exists (select * from (select top (页大小*页数) * from table1 order by id) b where

sql server分页查询

1.引言 在列表查询时由于数据量非常多,一次性查出来会非常慢,就算一次查出来了,也不能一次性显示给客户端,所以要把数据进行分批查询出来,每页显示一定量的数据,这就是数据要分页. 2.常用的数据分页方法 我们经常会碰到要取n到m条记录,就是有分页思想,下面罗列一下一般的方法. 我本地的一张表 tbl_FlightsDetail,有300多W记录,主键 FlightsDetailID(Guid),要求按照FlightsDetailID排序 取 3000001 到3000010 之间的10条记录,也是

SQL存储过程分页查询--只支持MSSQL2005及以上

USE [QSM] GO /****** Object: StoredProcedure [dbo].[UP_SysGetListByPage] Script Date: 04/12/2017 17:47:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create d

sql主表分页查询关联子表取任意一条高效方案

有个业务场景,主表中一条数据,在子表中有多条详情数据.对数据进行展示的时候,产品希望随意拿一条子表的数据关联展示出来,用了很多方案,但是都不够好. sql查询取子表任意一条,多个字段的方案 最终找到一个高效的方案记录如下: 需求如图: 最早的第一套方案: select distinct A.ID, A.Title, A.[Description], A.xx1, A.xx2, A.xx3, B.ID as BId, B.xxA, B.xxB, B.xxC, B.xxD from A left j

SQL SERVER 分页查询 和 Inser 添加并返回Id

--第一种分页 SELECT * FROM ( select ROW_NUMBER() over(order by id) as rows,* from [dbo].[M_User] --WHERE Id>1 ) AS T where rows BETWEEN 0 AND 2 --第二种分页 需SQL SERVER 2012以上支持 select * from [M_Role] order by Id offset 0 rows fetch next 10 rows only ; --执行Ins

SQL 高效分页查询

declare @page int --页码 declare @pagecount int;--每一页显示的记录数 set @page=2 set @pagecount=6 select * from (select *,row_number() over( order by id asc) as row from ADTypes) as a where row between (@page*@pagecount-@pagecount+1) and (@page*@pagecount)

MySQL、Oracle和SQL Server的分页查询语句

原文地址:http://www.cnblogs.com/ginponson/p/5746435.html 假设当前是第PageNo页,每页有PageSize条记录,现在分别用Mysql.Oracle和SQL Server分页查询student表. 1.Mysql的分页查询 SELECT * FROM student LIMIT (PageNo - 1) * PageSize,PageSize; 理解:(Limit n,m)  =>从第n行开始取m条记录,n从0开始算. 2.Oracel的分页查询