盘点SqlServer 分页方式和拉姆达表达式分页

 更新时间:2022年12月16日 08:35:45   作者:熊泽-学习中的苦与乐  
这篇文章主要介绍了SqlServer 5种分页方式和拉姆达表达式分页,进来看看吧,本文结合示例代码给大家讲解的非常详细,需要的朋友可以参考下

现在基本上大家都在使用各种轮子自带的分页,大家是否还记得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() 后面的就不推荐使用 。

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

到此这篇关于盘点SqlServer 分页方式和拉姆达表达式分页的文章就介绍到这了,更多相关SqlServer 分页拉姆达表达式分页内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接,错误:“The server selected protocol version TLS10 is not accepted by client

    驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接,错误:“The serve

    这篇文章主要介绍了驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接,错误:“The server selected protocol version TLS10 is not accepted by client,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • sql语句中union的用法与踩坑记录

    sql语句中union的用法与踩坑记录

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集,下面这篇文章主要给大家介绍了关于sql语句中union用法与踩坑的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • 丢失的数据忘记备份的处理方法[图文]

    丢失的数据忘记备份的处理方法[图文]

    突然间数据库无缘无故损坏了,差异备份或事务日志备份在3点才会自动去做,那么如何将2点到2点40之间的数据恢复呢?这就需要通过备份尾部日志进行恢复了。
    2009-06-06
  • 一文搞懂SQL注入攻击

    一文搞懂SQL注入攻击

    SQL注入(SQL Injection)攻击是其中最普遍的安全隐患之一,因此,如何防范SQL注入攻击成为了网络安全领域的一个重要议题。本文通过代码示例详细介绍了SQL注入攻击,需要的朋友可以参考一下
    2023-04-04
  • SQL中位数函数实例

    SQL中位数函数实例

    本文主要介绍一个SQL中位数函数应用实例,比较实用,希望能给大家做一个参考。
    2016-06-06
  • SQL Server文件组的用法和原理

    SQL Server文件组的用法和原理

    数据文件的组合,称作文件组(File Group),数据库不能直接设置存储数据的数据文件,而是通过文件组来指定,本文给大家详细的介绍了SQL Server文件组,并通过代码讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • sql server中错误日志errorlog的深入讲解

    sql server中错误日志errorlog的深入讲解

    很多时候诊断SQLSERVER问题都需要看SQLSERVER的错误日志,所以下面这篇文章主要给大家介绍了关于sql server中错误日志errorlog的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-10-10
  • MySQL令人大跌眼镜的隐式转换

    MySQL令人大跌眼镜的隐式转换

    本文接下来讲解的是MySQL的隐式转换,对此感兴趣的小伙伴很可以一起来看看
    2021-08-08
  • php使用pdo连接sqlserver示例分享

    php使用pdo连接sqlserver示例分享

    在开发PHP程序时我们可以借助多种连接方式访问各类的数据库获取所需的数据。自PHP5以来PDO作为新生事物将所有数据库接口收入囊中,为开发人员提供了方便快捷的数据库读取方式。本文将介绍如何在Linux服务器配置PHP与SQL Server的连接
    2014-01-01
  • SQL server中提示对象名无效的解决方法

    SQL server中提示对象名无效的解决方法

    本文主要介绍了SQL server中提示对象名无效的解决方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论