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

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


喜欢就点赞加关注。

欢迎关注订阅微信公众号【熊泽有话说】,更多好玩易学知识等你来取
作者:熊泽-学习中的苦与乐
公众号:熊泽有话说

QQ群:711838388
出处:https://www.cnblogs.com/xiongze520/p/16985440.html
您可以随意转载、摘录,但请在文章内注明作者和原文链接。 

盘点现在用的SqlServer 5种分页方式和拉姆达表达式分页,进来看看吧。的更多相关文章

  1. EasyUI 之 DataGrid利用用拉姆达表达式实现分页查询

      首先,我们在DataGrid的URL中加上我们要查询的条件:查询用户名不是“呵呵”的所有用户. <div> <table id="dg" class=&quo ...

  2. Entity Framework后台采用分页方式取数据与AspNetPager控件的使用

    本文是一个对AspNetPager控件使用的笔记! 有关AspNetPager控件可以查看杨涛主页.这是一个开放的自定义ASP.NET控件,支持各种自定义的数据分页方式,使用很方便,而且功能也很强大, ...

  3. Java Map集合 遍历 五种方式(包含 Lambda 表达式遍历)

    示例代码如下: package com.miracle.luna.lambda; import java.util.HashMap; import java.util.Iterator; import ...

  4. MySql、SqlServer、Oracle 三种数据库查询分页方式

    SQL Server关于分页 SQL 的资料许多,有的使用存储过程,有的使用游标.本人不喜欢使用游标,我觉得它耗资.效率低:使用存储过程是个不错的选择,因为存储过程是颠末预编译的,执行效率高,也更灵活 ...

  5. sqlserver的四种分页方式

    第一种:ROW_NUMBER() OVER()方式 select * from ( select *, ROW_NUMBER() OVER(Order by ArtistId ) AS RowId f ...

  6. SQLServer常用分页方式

    mysql的分页是基于limit关键字,oracle的分页是基于rownum行号,SQLserver的分页在下面进行研究,是基于SQLServer2012进行的测试. 0.原来的SQL的所有数据 下面 ...

  7. [转]几种常见SQL分页方式

    创建环境: create table pagetest ( id ,) not null, col01 int null, col02 ) null, col03 datetime null ) -- ...

  8. Asp.Net中的三种分页方式

    Asp.Net中的三种分页方式 通常分页有3种方法,分别是asp.net自带的数据显示空间如GridView等自带的分页,第三方分页控件如aspnetpager,存储过程分页等. 第一种:使用Grid ...

  9. Mybatis四种分页方式

    数组分页 查询出全部数据,然后再list中截取需要的部分. mybatis接口 List<Student> queryStudentsByArray(); xml配置文件 <sele ...

  10. 基于layPage分页插件浅析两种分页方式

    最近在开发过程中经常用到分页,今天挤出些时间来捋一捋自己的经验 在web开发中,一般显示数据列表页时,我们会用到分页控件来显示数据.采用分页一般基于两种不同的需求,一种是数据量不算很大,但是在页面展示 ...

随机推荐

  1. Alertmanager集成Dingtalk/Wechat/Email报警

    grafana对报警的支持真的很弱,而Prometheus提供的报警系统就强大很多 Prometheus将数据采集和报警分成了两个模块.报警规则配置在Prometheus Servers上,然后发送报 ...

  2. 使用 Windows 包管理器 (winget) 安装 .Net

    用户可以在 Windows 10 和 Windows 11 计算机上使用 winget 命令行工具来发现.安装.升级.删除和配置应用程序. 此工具是 Windows 程序包管理器服务的客户端接口. 以 ...

  3. P3919 【模板】可持久化线段树 1(可持久化数组)

    还是用主席树来做(因为提到不同的版本),这时候的主席树不是以权值为下标的,就是普通的线段树,维护范围1~n,i存的是a[ ]中的数. 1 #include <bits/stdc++.h> ...

  4. map集合类型/实体类类型的参数

    map集合类型的参数 若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合, 将这些数据放在map中 只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${}需要 ...

  5. 1.RabbitMQ系列之服务启动

    1. docker方式启动MQ # latest RabbitMQ 3.10 docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:156 ...

  6. 某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该请假条;如果员工请假天数大于等于3天,小于10天,经理可以审批;如果员工请假天数大于等于10天,小于30天,总经理可以审批

    某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该请假条:如果员工请假天数大于等于3天,小于10天,经理可以审批:如果员工请假天数大于等于10天,小于30天,总经理可以审批 ...

  7. Vue中组件化编码使用、实现组件之间的参数传递(实战练习二)

    上一章节实现的是静态页面的设计.这一章节实现将数据抽取出来.通过组件间参数的传递来实现 上一章节链接地址:https://blog.csdn.net/weixin_43304253/article/d ...

  8. vue-router(路由嵌套)

    文章目录 1.项目结构 2.路由嵌套 3.界面(使用elementui) 4.效果展示 1.项目结构 2.路由嵌套 import Vue from 'vue' import Router from ' ...

  9. 34.HyperLinkedModelSerializer详解

    HyperLinkedModelSerializer继承ModelSerializer,只是自动多出了一个url字段,其他都是一样的 不同之处在于使用超链接来表示关联关系而不是主键 默认情况下Hype ...

  10. Linq--取group分组后的每组第一条数据

    Linq对指定字段分组并取每组第一个值 先排序后分组 目的:取每个RequestID组内的最大HistoryID的数据 //对RequestID进行分组降序排序,去每组的第一条数据 IList< ...