暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

盘点现在用的SqlServer 5种分页方式和拉姆达表达式分页,快来看看吧

熊泽有话说 2022-12-15
196

目录

  • 1、ROW_NUMBER() OVER()方式(SQL2012以下推荐使用)

  • 2、offset fetch next方式(SQL2012及以上的版本才支持:推荐使用 )

  • 3、top not in方式 (不推荐)

  • 4、通过升序与降序方式进行查询分页(不推荐)

  • 5、采用MAX(ID)或者MIN(ID)函数(不推荐)

  • 6、Lambda表达式分页(推荐使用)

 


现在基本上大家都在使用各种轮子自带的分页,大家是否还记得sql分页怎么写?

今天我们就来盘一盘怎么写和用哪种方式写。

欢迎大家评论区讨论。

1、ROW_NUMBER() OVER()方式(SQL2012以下推荐使用

示例:

    SELECT * FROM
    (SELECT ROW_NUMBER() OVER(ORDER BY menuId) AS RowId,* FROM sys_menu ) AS r
    WHERE RowId BETWEEN 1 AND 10
    复制

    用子查询新增一列行号(ROW_NUMBER)RowId查询,比较高效的查询方式,只有在SQL Server2005或更高版本才支持。

    BETWEEN 1 AND 10 是指查询第1到第10条数据(闭区间),在这里面需要注意的是OVER的括号里面可以写多个排序字段。

    查询结果如下:

    通用用法

      --pageIndex 表示指定页
      --pageSize 表示每页显示的条数
      SELECT * FROM
      (SELECT ROW_NUMBER() OVER(ORDER BY 排序字段) AS RowId,* FROM 表名 ) AS r
      WHERE RowId BETWEEN ((pageIndex-1)*pageSize + 1) AND (pageIndex * PageSize)
      复制

      2、offset fetch next方式(SQL2012及以上的版本才支持:推荐使用 )

      示例:

        --offset fetch next方式查询,最高效的查询方式,只有在SQL Server2012或更高版本才支持
        SELECT * FROM sys_menu
        ORDER BY menuId offset 0 ROWS FETCH NEXT 10 ROWS ONLY
        复制

        offset 是跳过多少行,

        next是取接下来的多少行,

        句式 offset...rows fetch nect ..rows only ,注意rows和末尾的only 不要写漏掉了,并且这种方式必须要接着Order by XX 使用,不然会报错

        查询结果如下:

        通用用法

          --pageIndex 表示指定页
          --pageSize 表示每页显示的条数
          SELECT * FROM 表名
          ORDER BY 排序字段 offset ((pageIndex - 1) * pageSize) ROWS FETCH NEXT pageSize ROWS ONLY
          复制

          3、top not in方式 (不推荐)

          示例:

            --查询第11-20条记录
            SELECT TOP 10 menuId, *
            FROM sys_menu
            WHERE menuId NOT IN (SELECT TOP 10 menuId FROM sys_menu)
            复制

            这条语句的原理是先查询1-10条记录的ID,然后再查询ID不属于这1-10条记录的ID,并且只需要10条记录,因为每页大小就是10,

            这就是获取到的第11-20条记录,这是非常简单的一种写法。

            另外IN语句与NOT IN语句类似,这是NOT IN的写法,但是这种写法数据量大的话效率太低。

            查询结果如下:

            通用用法

              --pageIndex 表示指定页
              --pageSize 表示每页显示的条数
              SELECT TOP pageSize menuId, *
              FROM sys_menu
              WHERE menuId NOT IN (SELECT TOP ((pageSize-1)*pageIndex) menuId FROM sys_menu)
              复制

              4、通过升序与降序方式进行查询分页(不推荐)

              示例:

                --使用升序降序的方式分页查询
                SELECT * FROM(
                SELECT TOP 10 * FROM(
                SELECT TOP 20 * FROM sys_menu ORDER BY menuId ASC)
                AS TEMP1 ORDER BY menuId DESC)
                AS TEMP2 ORDER BY menuId ASC
                复制

                这条语句首先查询前20条记录,然后在倒序查询前10条记录(即倒数10条记录),

                这个时候就已经获取到了11-20条记录,但是他们的顺序是倒序,所以最后又进行升序排序。

                查询结果如下:

                通用方法

                  --pageIndex 表示指定页
                  --pageSize 表示每页显示的条数
                  SELECT * FROM(
                  SELECT TOP pageSize * FROM(
                  SELECT TOP ((pageIndex - 1) * pageSize +(pageSize*2)) * FROM sys_menu ORDER BY menuId ASC)
                  AS TEMP1 ORDER BY menuId DESC)
                  AS TEMP2 ORDER BY menuId ASC
                  复制

                  5、采用MAX(ID)或者MIN(ID)函数(不推荐)

                  示例:

                    --MIN()函数和MAX()函数的使用
                    --id > 第(PageIndex-1)*PageSize条记录的id AND id <= 第PageIndex*PageSize条记录的id
                    SELECT TOP 10 * FROM sys_menu WHERE menuId>
                    (SELECT MAX(menuId) FROM(SELECT TOP 10 menuId FROM sys_menu ORDER BY menuId) AS TEMP1) --(第10条的id)
                    复制

                    这个理解起来也简单,先把第10条记录的id找出来(当然这里面是直接使用MAX()进行查找,MIN()函数的用法也是类似的),

                    然后再对比取比第10条记录的id大的前10条记录即为我们需要的结果。

                    这里要注意开始时的边界值调整。

                    查询结果如下:

                    通用用法

                      --pageIndex 表示指定页
                      --pageSize 表示每页显示的条数
                      SELECT TOP pageSize * FROM sys_menu WHERE menuId>
                      (SELECT MAX(menuId) FROM(SELECT TOP ((PageIndex-1)*PageSize) menuId FROM sys_menu ORDER BY menuId) AS TEMP1) --(第10条的id)
                      复制

                      6、Lambda表达式分页(推荐使用)

                      我们在数据库分页的时候,还可以在代码里面使用lambda表达式分页。

                      示例:

                        List<int> list = new List<int>();
                        for (int i = 0; i < 100; i++)
                        {
                        list.Add(i);
                        }
                        //从第11条数据开始,获取10条数据
                        list = list.Skip(11).Take(10).ToList(); //返回值 11,12,13,14,15,16,17,18,19,20
                        复制

                        Skip: 表示从第 (pageIndex * pageSize + 1) 条数据开始,也就是说再这之前有pageIndex * pageSize条数据。

                        Task:表示获取多少条数据。

                        通用用法

                          list = list.Skip(pageIndex * pageSize +1 ).Take(pageSize).ToList();
                          复制

                          以上就是数据查询中经常用到的方式,

                          在数据库版本支持的情况下个人推荐程度排序:offset fetch netct  > lambda  > ROW_NUMBER() OVER() 后面的就不推荐使用 。

                          这样就可以配合存储过程进行分页了。


                                 

                          文章转载自熊泽有话说,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论