SQL--实现分页查询

原文: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-12-02 01:10:28

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

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

Sql数据库分页查询语句

MySQL  --查询第10到20条数据   代码如下 复制代码 SELECT * FROM table_name WHERE - LIMIT 10,20;   SQLServer  代码如下 复制代码  --查询前10|10%条数据   SELECT TOP 10|10% * FROM table_name;   --查询第10到20条数据   SELECT TOP 10 * FROM    (SELECT TOP 20 * FROM table_name ORDER BY id ASC) a

SQL Server 分页查询通用存储过程(只做分页查询用)_MsSql

自开始做项目以来,一直在用.这段存储过程的的原创者(SORRY,忘记名字了),写得这段SQL代码很不错,我在这个基础上,按照我的习惯以及思维方式,调整了代码,只做分页查询用. /*---------------------------------------------- *procedure name : P_PageResult * author :Fay * create date : 2014-07-18 */ CREATE PROCEDURE prcPageResult -- 获得某一

SQL Server 分页查询通用存储过程(只做分页查询用)

自开始做项目以来,一直在用.这段存储过程的的原创者(SORRY,忘记名字了),写得这段SQL代码很不错,我在这个基础上,按照我的习惯以及思维方式,调整了代码,只做分页查询用. /*---------------------------------------------- *procedure name : P_PageResult * author :Fay * create date : 2014-07-18 */ CREATE PROCEDURE prcPageResult -- 获得某一

SQL Server 分页查询存储过程代码_MsSql

复制代码 代码如下: CREATE PROCEDURE [dbo].[up_Pager] @table varchar(2000), --表名 @col varchar(50), --按该列来进行分页 @orderby bit, --排序,0-顺序,1-倒序 @collist varchar(800),--要查询出的字段列表,*表示全部字段 @pagesize int, --每页记录数 @page int, --指定页 @condition varchar(800) --查询条件 AS DECL

SQL Server 分页查询存储过程代码

  EXEC up_Pager '(SELECT * FROM 表名)aa','要排序的列名',0-顺序或1-倒序,'显示列',每页记录数,指定页,'条件' EXEC up_Pager '(SELECT * FROM T_Gather_Page)aa','SaveTime',1,'*',40,3,''   CREATE PROCEDURE [dbo].[up_Pager] @table varchar(2000), --表名 @col varchar(50), --按该列来进行分页 @order

也说sql server分页查询

server|分页 现在一般常用的有以下2种方法: 1. select top @pagesize * from table1 where id not in  (select top @pagesize*(@page-1) id  from table1 order by id) order by id 2. select *  from (select top @pagesize * from (select top @pagesize*@page * from table1 order b

.net中关于linq执行sql语句分页查询的功能

问题描述 publicList<V_NoEpay_User>GetOrderDatas(intstart,intcount,outinttotCount,DateTime?starTime,DateTime?endTime),应该怎么样来下逻辑呢,求大神们帮忙,如果能帮忙写出来就最好 解决方案 解决方案二:去Linq专区吧......现在Linq专区都成翻译了..解决方案三:returnquery.OrderBy(x=>排序条件).Skip((页码-1)*每页数).Take(每页数)解决

asp.net防sql注入分页查询参数代码(1/2)

使用方法:   pagerquery query = new pagerquery(); query.pageindex = 1;     query.pagesize = 20;     query.pk = "id";     query.selectclause = "*";     query.fromclause = "testtable";     query.sortclause = "id desc";