zoukankan      html  css  js  c++  java
  • SQLServer常用分页方式

      mysql的分页是基于limit关键字,oracle的分页是基于rownum行号,SQLserver的分页在下面进行研究,是基于SQLServer2012进行的测试。

    0.原来的SQL的所有数据

    下面的测试假设每页都是取5条数据。

    1.第一种-ROW_NUMBER() OVER()方式(over函数必须有)

     (1)取第一页数据

      select * from ( 
        select *, ROW_NUMBER() OVER(Order by ID ) AS RowId from [mydb].[dbo].[user] 
      ) as b
    
          where RowId between 1 and 5;

     结果:

    (2)取第二页数据

      select * from ( 
        select *, ROW_NUMBER() OVER(Order by ID ) AS RowId from [mydb].[dbo].[user] 
      ) as b
    
          where RowId between 6 and 10;

    结果:

     总结:  这种方式采用    RowId BETWEEN 当前页数-1*页大小+1  and 页数*页大小   ,而且包含起始值与结束值。

    补充:这种方式的通用写法如下:   原来SQL不能带order by ,但是可以带条件。

    原来SQL =     select * from [mydb].[dbo].[user] where name like 'name%'    

    拼接分页的模板如下: 

     select * from ( 
        select *, ROW_NUMBER() OVER(Order by ID ) AS RowId from    (
                原来SQL
            ) AS A
    ) as B
    where RowId between 1 and 5;

    2.第二种-offset start fetch next page rows only

    (1)取第一页

    select * from [mydb].[dbo].[user]   order by ID offset 0 rows fetch next 5 rows only;

    结果:

     

    (2)取第二页

    select * from [mydb].[dbo].[user]   order by ID offset 5 rows fetch next 5 rows only;

    结果:

     总结:这种方式的起始值与结束值计算方式: offset 页号*页大小 rows fetch next 页大小 rows only  

    3.第三种: top 关键字

     (1)取第一页

    select top 5 * from [mydb].[dbo].[user] 
    where ID not in (select top 0 ID from [mydb].[dbo].[user]);

    结果:

    (2)取第二页

    select top 5 * from [mydb].[dbo].[user] 
    where ID not in (select top 5 ID from [mydb].[dbo].[user]);

    结果:

      总结:这种方式只用改内层的 top就可以了:  内层的top后面相当于起始值,计算方式为  (页号-1)*页大小。

      补充:这种分页方式的通用模板如下:  这个可以加order by和条件

    原来SQL = select * from [mydb].[dbo].[user] where name like 'name%'   

    select top 5 * from ( 
        原来SQL
    ) AS A where ID not in (select top 5 ID from [mydb].[dbo].[user]);

    4.  ROW_NUMBER() + top 相当于上面1和3的结合使用

     (1)取第一页

    select top (5) * from (select *, ROW_NUMBER() OVER(Order by ID ) AS RowId from [mydb].[dbo].[user]) as A where A.RowId>0;

    结果:

    (2)取第二页

    select top (5) * from (select *, ROW_NUMBER() OVER(Order by ID ) AS RowId from [mydb].[dbo].[user]) as A where A.RowId>5;

    结果:

      总结:这种方式比较通用, 第一个 top 里面的值 相当于 页大小,第二个rowID>起始值,起始值计算方式为  (页号-1)*页大小

    补充:这种分页方式的通用模板如下:    这种方式原来的SQL也不用加排序语句

    原来SQL = select * from [mydb].[dbo].[user] where name like 'name%'   

    select top (5) * from (
        select *, ROW_NUMBER() OVER(Order by ID ) AS RowId from (
            原来SQL
            ) as A   
    ) as B where B.RowId>5;

    注意:文中SQLServer的AS A这些起别名不能省略。

  • 相关阅读:
    Hadoop 无法实现HA
    Hive 常见设置
    Hive 查看表的文件个数(用于分析小文件)
    Hive 窄表转宽表 , 长表转宽表
    MapReduce 实现分片取TopN 再Reduce取TopN
    Hbase 如何用对rowkey加盐
    VMware虚拟机安装Ubuntu操作系统
    使用springboot进行文件的上传下载操作(有源码)
    使用图片定位图片拍摄的具体位置
    vue实现Element-ui省市区三级联动(包含省市区文件和省市文件)
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/10305188.html
Copyright © 2011-2022 走看看