SqlServer分页

前言

最近开始接触sqlserver数据库,由于之前一直使用的是mysql的数据库,所以很多不太明白的地方,特此记录下。

正文

1. SqlServer的分页(sqlserver2008)

方法一:select top n  from 。。。 where id not in (select top m from 。。)的方法。(效率一般,多表查询代码复杂。)

方法解释: 假设要查询第5页,每页10条数据,那么就是要查询第40-50条数据。那么我们可以查询id不在 前40条数据的id中的数据,然后去top 10条数据即可。

SELECT top 10 * FROM t_user WHERE ID NOT IN (SELECT TOP 50 ID FROM t_user);

总计显示的是:第51-60条数据。

需要注意的是:

1. 本方法要求所查询的表必须要主键或者表示唯一性的列,如果没有,则不能使用。

2. 本方法不会出现最后一页不足每页大小的时候自动补足的情况。也就是说,当你查询到倒数第二页的时候,如果最后一页不足要求总条数,则会显示剩余条数。比如要求10条每页,最后一页只有8条,则显示8条。

方法二: select * from (select top 10 * from (select top 20 * from user order by time desc)  a order by a.time  ) b  order by b.time desc;(效率略低,多表查询代码简洁。并且需要处理最后一页数据。)

(作者注:由于本次查询我使用的是三表联查的方法进行的查询并且还要分页,并且没有唯一列,如果要使用别的方法,那么我只能把三表查询作为一个中间表来使用了。但是那样的话代码量会比较大,所以选择了这种方法。)

方法解释:要查询第5页,也就是40-50的数据,我先倒序查询出50条,然后正序排列,拿前面10条,也就是需要的40-50条数据。如果需要倒序排列,则重新在查询一下结果,倒序排列即可。如果你不需要倒序排列,则可以直接正序查询前50条数据,然后把数据倒序排列,那前10条就是所需要的数据。

SELECT * FROM (
    SELECT top 10 * FROM (
        SELECT TOP 50 tdhv.* 
        FROM T_XXXXX tdhv
        ORDER BY tdhv.CHECK_TIME DESC) a 
    ORDER BY a.check_time ) b 
ORDER BY b.check_time DESC

结果如下:

此表并没有id,但是依旧可以进行分页。

需要特别注意的是:当你最后一页不足所需的每页数量的时候(假设每页10条,最后一页剩余8条),如果用这种方法查询的话,会得到10条数据,最后有两条是重复的!!因为你倒序取的是10条,所以这里必须在程序里面进行处理!

我是这么处理的:每次查询的时候判断当前页码乘以每页条数跟总记录数之间差值,如果大于总记录数,那么表示最后一页不足每页记录的条数。这时候就需要调整你要查询的记录条数了

查询条数为: 总记录数 - (当前页码-1)* 每页条数,得到还剩余多少条记录。

查询总条数为: 总记录数。

这里需要对数据进行判断。

方法三:查询到需要行数据的id,然后使用内连接,再次查询这些id对应的列的其它的值。(效率挺高,单表查询方便,多表代码量会很大。并且要自定义处理最后一页数据。)

SELECT * FROM XXXX,
(SELECT TOP 10 ID FROM (SELECT TOP 20 ID FROM XXXX ORDER BY XXXX.ID ASC) a ORDER BY a.ID DESC) b
WHERE XXXX.ID = b.ID;

结果就不展示了,展示的还是10条,但是需要注意的也是:最后一页的数据必须自定义才能查询,否则会造成查询到的数据多。

并且:因为是使用的内连接,还可以使用 in(ids)的方法进行解决,效率应该也可以。原理是一样的,先查询id,然后根据id查询所有结果。


2018-07-25更新

方法四:使用rownum来进行统计并查询分页

没有进行分页(左图)

SELECT 
    tbl_unit.ID,tbl_unit.NAME,
    ROW_NUMBER () OVER (ORDER BY tbl_unit.ID DESC) AS rowNum
FROM
tbl_unit

进行分页:取前五条记录(右图)

SELECT * FROM (
SELECT 
    tbl_unit.ID,tbl_unit.NAME,
    ROW_NUMBER () OVER (ORDER BY tbl_unit.ID DESC) AS rowNum
FROM
tbl_unit) b WHERE b.rowNum BETWEEN 1 and 5 

代码简单,使用rowNum进行统计总数量。并使用between。。and来获取。也可以使用 rowNum >= 1  and rowNum <= 5


 2. SqlServer的分页(sqlserver 2012之后)

sqlserver在2012之后有了新的分页方法: OFFSET 开始的条数  ROW FETCH NEXT 取多少条数据 ROWS ONLY;类似于mysql的limit分页方法(由于作者未安装2012版本sqlserver,所以此条未经作者测试

select id from a Order by id Offset 0 Row Fetch Next 5 Rows Only.

需要注意的是:这种方法支持SQLServer2012,但是SQLServer2008不支持!!

本条参考: https://blog.csdn.net/zhoukun1008/article/details/52910436 

原文地址:https://www.cnblogs.com/chenmc/p/9262796.html