现在基本上大家都在使用各种轮子自带的分页,大家是否还记得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. PostgreSQL 语法

    进入命令行工具,我们可以使用 \help 来查看各个命令的语法 : postgres-# \help <command_name> 例如,我们查看下 select 语句的语法: postg ...

  2. python及第三方库交叉编译

    一.前言: 网上关于python的交叉编译的文章很多,但是关于python第三库的交叉编译的文章就比较少了,而且很多标题是第三方库的交叉编译,但是实际上用到的都是不需要交叉编译就能用的库,可参考性不强 ...

  3. 持续集成指南:GitLab 的 CI/CD 工具配置与使用

    前言 写代码这项工作,本质就是将工作自动化,减少手工操作提供效率,因为人的本质都是懒狗,程序员也不能例外,为了各种意义的效率提升(懒),我们需要持续集成工具,将代码测试.编译.发布这些重复性很高的工作 ...

  4. 无需Steam的Proton,在你的Linux运行任意Windows游戏!

    链接: https://pan.baidu.com/s/1QeJxj9_2aZPk2_uZMzpn9A 提取码: v6t6 包含的版本 Proton4.11  Proton4.2  Proton5.0 ...

  5. HBase(1/5)

    HBase学习(一) 一.了解HBase 官方文档:https://hbase.apache.org/book.html 1.1 HBase概述 HBase 是一个高可靠性.高性能.面向列.可伸缩的分 ...

  6. 华为交换机STP常用命令

    STP配置和选路规则 stp enable 在交换机上启用STP stp mode stp dis stp 查看stp配置 dis stp brief 查看接口摘要信息 stp priority 40 ...

  7. Git的使用以及常用命令(详解)

    一. 版本控制工具 什么是版本控制系统? 版本控制系统(Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版 本修订情况的系统.版本控制系统不仅可以应用 ...

  8. 4.ElasticSearch系列之基本概念

    1. 文档 ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位 文档会被序列化成JSON格式,保存在ES中 每个文档都有一个unique ID #查看前10条文档,了解文档格式 P ...

  9. 如何在IDEA中创建Module、以及怎样在IDEA中删除Module?

    文章目录 1.为何要使用Module? 2.Module的创建 3.如何从硬盘上删除module 1.为何要使用Module? 目前主流的大型项目都是分布式部署的,结构类型这种多Module结构.不同 ...

  10. java 新特性之 Stream API

    强大的 Stream API 一.Stream API 的概述 Stream到底是什么呢? 是数据渠道,用于操作数据源(集合.数组等)所生成的元素序列. "集合讲的是数据,Stream讲的是 ...