SQL实现分页查询方法总结

 更新时间:2021年12月20日 10:32:28   作者:十九画生  
这篇文章介绍了SQL实现分页查询方法总结,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

开发过程中经常遇到分页的需求,今天在此总结一下吧。

简单说来方法有两种,一种在源上控制,一种在端上控制。源上控制把分页逻辑放在SQL层;端上控制一次性获取所有数据,把分页逻辑放在UI上(如GridView)。显然,端上控制开发难度低,适于小规模数据,但数据量增大时性能和IO消耗无法接受;源上控制在性能和开发难度上较为平衡,适应大多数业务场景;除此之外,还可以根据客观情况(性能要求,源与端的资源占用等)在源和端之间加一层,应用特殊算法和技术进行处理。以下主要讨论源上,即SQL上的分页。

分页的问题其实就是在满足条件的一堆有序数据中截取当前所需要展示的那部分。实际上各种数据库都考虑到分页问题而内置了一些策略,比如MySql的LIMIT,Oracle的ROWNUM和ROW_NUMBER(),SqlServer的TOP和ROW_NUMBER(),基于此我们可以得到一系列分页的方法。

1、 基于MySql的LIMIT和Oracle的ROWNUM,可以直接限制返回区间(以MySql为例,注意使用Oracle的ROWNUM时要应用子查询):

方法一、直接限制返回区间
SELECT * FROM table WHERE 查询条件 ORDER BY 排序条件 LIMIT ((页码-1)*页大小),页大小;

优点:写法简单。

缺点:当页码和页大小过大时,性能明显下降。

适用:数据量不大。

2、基于LIMIT(MySql)、ROWNUM(Oracle)和TOP(SqlServer),他们可以限制返回的行数,因此可以得到以下两套通用的方法(以SqlServer为例):

方法二、NOT IN
SELECT TOP 页大小 * FROM table WHERE 主键 NOT IN
(
    SELECT TOP (页码-1)*页大小 主键 FROM table WHERE 查询条件 ORDER BY 排序条件
)
ORDER BY 排序条件

优点:通用性强。

缺点:当数据量较大时向后翻页,NOT IN中的数据过大会影响性能。

适用:数据量不大。

方法三、MAX
SELECT TOP 页大小 * FROM table WHERE 查询条件 AND id >
(
    SELECT ISNULL(MAX(id),0) FROM 
    (
        SELECT TOP ((页码-1)*页大小) id FROM table WHERE 查询条件 ORDER BY id 
    ) AS tempTable
) 
ORDER BY id

优点:速度快,特别是当id为主键时。

缺点:适用面窄,要求排序条件单一且可比较。

适用:简单排序(特殊情况也可尝试转换成类似可比较值处理)。

3、基于SqlServer和Oracle的ROW_NUMBER(),可以得到返回数据的行号,基于此在限制返回区间得到如下方法(以SqlServer为例):

方法四、ROW_NUMBER()
SELECT TOP 页大小 * FROM 
(
    SELECT TOP (页码*页大小) ROW_NUMBER() OVER (ORDER BY 排序条件) AS RowNum, * FROM table WHERE 查询条件
) AS tempTable
WHERE RowNum BETWEEN (页码-1)*页大小+1 AND 页码*页大小
ORDER BY RowNum

优点:在数据量较大时相比NOT IN有优势。

缺点:小数据量时不如NOT IN。

适用:大部分分页查询需求。

到此这篇关于SQL实现分页查询方法总结的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 200行代码轻松实现一个简单的区块链

    200行代码轻松实现一个简单的区块链

    这篇文章主要为大家详细介绍了200行代码轻松实现一个简单的区块链,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • sql连接查询语句中on、where筛选的区别总结

    sql连接查询语句中on、where筛选的区别总结

    接触Sql语句时间挺长时间了,听他人说过sql语句的连接查询,但一直没有认真研究和使用过!下面这篇文章主要给大家介绍了关于sql连接查询语句中on、where筛选两者之间区别的相关资料,文中通过图文介绍的非常详细,需要的朋友们下面来一起看看吧。
    2017-07-07
  • Navicat12.1系列破解激活教程亲测有效

    Navicat12.1系列破解激活教程亲测有效

    这篇文章主要介绍了 Navicat12.1系列破解激活教程亲测有效,本文给大家介绍的非常详细,对大家的学习或工作工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • node-mysql中防止SQL注入的方法总结

    node-mysql中防止SQL注入的方法总结

    大家都知道SQL注入对于网站或者服务器来讲都是一个非常危险的问题,如果这一方面没处理好的话网站可能随时给注入了,所以这篇文章就给大家总结了node-mysql中防止SQL注入的几种常用做法,有需要的朋友们可以参考借鉴。
    2016-10-10
  • 数据库同步优化技巧分享

    数据库同步优化技巧分享

    这篇文章主要介绍了数据库同步优化技巧分享,需要的朋友可以参考下
    2015-10-10
  • Mac系统Navicat的安装与使用教程

    Mac系统Navicat的安装与使用教程

    这篇文章主要介绍了Mac系统Navicat的破解安装与使用教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 数据库删除完全重复和部分关键字段重复的记录

    数据库删除完全重复和部分关键字段重复的记录

    重复记录分为两种,第一种是完全重复的记录,也就是所有字段均重复的记录,第二种是部分关键字段重复的记录,例如Name字段重复,而其它字段不一定重复或都重复。
    2008-05-05
  • 利用DataSet部分功能实现网站登录

    利用DataSet部分功能实现网站登录

    这篇文章主要介绍了利用DataSet部分功能实现网站登录 ,需要的朋友可以参考下
    2017-05-05
  • 详细聊聊sql中exists和not exists用法

    详细聊聊sql中exists和not exists用法

    mysql exists或not exists语句用于子查询,改语句只返回 TRUE 或 FALSE,下面这篇文章主要给大家介绍了关于sql中exists和not exists用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Hive导入csv文件示例

    Hive导入csv文件示例

    这篇文章主要为大家介绍了Hive导入csv文件示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论