首页 > 数据库 >盘点现在用的SqlServer 5种分页方式和拉姆达表达式分页,进来看看吧。

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

时间:2022-12-15 17:14:25浏览次数:84  
标签:10 pageIndex 分页 pageSize menuId SqlServer -- SELECT 拉姆

现在基本上大家都在使用各种轮子自带的分页,大家是否还记得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
您可以随意转载、摘录,但请在文章内注明作者和原文链接。  

 

 

标签:10,pageIndex,分页,pageSize,menuId,SqlServer,--,SELECT,拉姆
From: https://www.cnblogs.com/xiongze520/p/16985440.html

相关文章

  • 【SQLServer2008】之Telnet以及1433端口设置
    原文链接:https://www.cnblogs.com/Owen-ET/p/5952706.htmlTelnet步骤:一、首先进入Win7控制面板,可以从开始里找到或者在桌面上找到计算机,点击进入里面也可以找到控制面板......
  • Mybatis学习之实现mybatis分页(8)
    上一篇文章里已经讲到了mybatis与springMVC的集成,并且做了一个列表展示,显示出所有article列表,但没有用到分页,在实际的项目中,分页是肯定需要的。而且是物理分页,不是内存分......
  • SqlServer获取当前日期
    获取当前日期selectGETDATE()格式化--2022-12-1413:42:14或20221214selectCONVERT(varchar,GETDATE(),120)--2022-12-1413:42:14selectCONVERT(varchar,G......
  • SqlServer查询历史某一时间段写的Sql脚本
    SELECTTOP1000--创建时间QS.creation_time,--执行文本ST.textFROMsys.dm_exec_query_statsQS--关键字CROSSAPPLYsys.dm_exec_sql_text(QS.sql_handle)STWH......
  • SQLServer 索引语句
    查看某表已存在的索引:execsp_helpindex[TableName]创建索引语句:1CREATE[UNIQUE][CLUSTERED|NONCLUSTERED]INDEX你起的索引名2ON{表名|视图名}(列......
  • sqlserver添加修改表备注信息
    添加表说明:EXECsys.sp_addextendedproperty@name=N'MS_Description',@value=N'表说明',@level0type=N'SCHEMA',@level0name=N'dbo',@level1type=N'TABLE',@level1na......
  • 查看sqlserver备份历史
    SELECTT1.name ,T3_full.full_backup_start_date ,T3_full.full_backup_finish_date ,T3_full.full_Duration ,t3_full.full_backup_size ,t3_full.full_physical_d......
  • Echars图例分页设置
    legend:{top:"4%",//图例上下位置left:"center",//图例左右位置itemGap:20,type:"scroll",//分页类型......
  • Selenium成长之路-26分页处理
    很长时间没有补充selenium的脚本了,今天有小朋友问我,如何定位分页。告诉完,索性把代码贴出来。  >>>url,填写自己项目中的url地址即可上代码:#-*-coding:utf-8-*-"""@......
  • 分页器
    目录PageNumberPaginationLimitOffsetPaginationCursorPagination使用APIView写分页三种分页方式:PageNumberPaginationLimitOffsetPaginationCursorPagination#set......