73.SQLSERVR的SQL实现分页查询的SQL(三种方式)

sqlServer的分页查询和mysql语句不一样,有三种实现方式。分别是:offset /fetch next、利用max(主键)、利用row_number关键字

一、offset /fetch next关键字

2012版本及以上才有,SQL server公司升级后推出的新方法。

公式:

1

2

3

4

5

6

-- 分页查询公式-offset /fetch next

select * from 表名

order by 主键 或 其他索引列

-- @pageIndex:页码、@pageSize:每页记录数

offset ((@pageIndex-1)*@pageSize) rows

fetch next @pageSize rows only;

示例:

1

2

3

4

5

-- 分页查询第2页,每页有10条记录

select * from tb_user

order by uid

offset 10 rows

fetch next 10 rows only ;

说明:

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

注意:mp的条件构造器中,

  1. 可以直接使用selectPage(lambdaWrapper wrapper,Page page)
  2. Wrapper调用last进行分页拼接

查询第二页,显示10条数据

wrapper.eq(User::getName,inVo.getName());

wrapper.last(offset 10 rows fetch next 10 rows only)

二、利用max(主键)

公式:

1

2

3

4

5

6

7

8

9

10

-- 分页查询公式-利用max(主键)

select top @pageSize *

from 表名

where 主键>=

(select max(主键)

    from (

        select top ((@pageIndex-1)*@pageSize+1) 主键

        from 表名 

        order by  主键 asc) temp_max_ids)

order by 主键;

示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

-- 分页查询第2页,每页有10条记录

select top 10 *

from tb_user

-- 3、再重新在这个表查询前10条,条件: id>=max(id)

where uid>=

-- 2、利用max(id)得到前11条记录中最大的id

(select max(uid)

    from (

        -- 1、先top前11条行记录

        select top 11 uid

        from tb_user

        order by  uid asc) temp_max_ids)

order by uid;

说明:

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

中心思想:其实就是先得到该页的初始id,PS:别忘了加上排序哦

三、利用row_number关键字

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

公式:

1

2

3

4

5

6

7

-- 分页查询公式-row_number()

select top @pageSize *

from (

    -- rownumber是别名,可按自己习惯取

    select row_number() over(order by 主键 asc) as rownumber,*

    from 表名) temp_row

where rownumber>((@pageIndex-1)*@pageSize);

示例:

1

2

3

4

5

6

7

8

-- 分页查询第2页,每页有10条记录

select top 10 *

from (

    -- 子查询,多加一个rownumber列返回

    select row_number() over(order by uid asc) as rownumber,*

    from tb_user) temp_row

    --限制起始行标

where rownumber>10;

说明:

利用row_number函数给每行记录标了一个序号,相当于在原表中多加了1列返回。

上述示例,是以序号11为起始行,查询前10条记录,即为第2页数据。

优化:

可以看到,子查询查询了全表数据,如果数据量大,效率是比较低的。

下面是优化后的SQL,

公式:

1

2

3

4

5

6

7

8

-- 分页查询公式-row_number()-优化版本

select *

from (

    -- rownumber是别名,可按自己习惯取

    select top (@pageIndex*@pageSize) row_number() over(order by 主键 asc)

    as rownumber,*

    from 表名) temp_row

where rownumber>((@pageIndex-1)*@pageSize);

示例:

1

2

3

4

5

6

7

8

-- 分页查询第2页,每页有10条记录

select *

from (

    -- 子查询,限制了返回前20条数据

    select top 20 row_number() over(order by uid asc) as rownumber,*

    from tb_user) temp_row

    --限制起始行标

where rownumber>10;

说明:

这里,子查询仅查询到当前页的最后一行,没有进行全表查询,所以效率上要快一点。在外层限制起始行标,是没变的,但是却在内层控制了结尾行标。

上述示例,是以序号11为起始行,查询20以内的记录,即为第2页数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莳光.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值