前言
最近开始接触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