在查询数据中,对于某些数据量过大,为了减少页面上单页的加载时间,我们常常会选择分页查询,分页查询有很多方法,下面主要介绍两种分页方法。
一. 通过主键来实现分页:
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的时候发现的. 对原理不熟悉。求各位博友指点。

