藏宝游

 找回密码
 立即注册
查看: 96|回复: 0

[数据库] SQL实现分页查询方法总结

[复制链接]
  • TA的每日心情
    无聊
    2024-3-8 09:16
  • 签到天数: 445 天

    [LV.9]登峰造极

    灌水成绩
    22
    521
    4765
    主题
    帖子
    积分

    等级头衔

    ID : 4

    版主

    积分成就 威望 : 0
    贡献 : 0
    杰币 : 4173
    在线时间 : 101 小时
    注册时间 : 2022-1-8
    最后登录 : 2024-3-8

    荣誉勋章
    发表于 2024-3-10 13:40:55 | 显示全部楼层 |阅读模式
    开发过程中经常遇到分页的需求,今天在此总结一下吧。
    简单说来方法有两种,一种在源上控制,一种在端上控制。源上控制把分页逻辑放在SQL层;端上控制一次性获取所有数据,把分页逻辑放在UI上(如GridView)。显然,端上控制开发难度低,适于小规模数据,但数据量增大时性能和IO消耗无法接受;源上控制在性能和开发难度上较为平衡,适应大多数业务场景;除此之外,还可以根据客观情况(性能要求,源与端的资源占用等)在源和端之间加一层,应用特殊算法和技术进行处理。以下主要讨论源上,即SQL上的分页。
    分页的问题其实就是在满足条件的一堆有序数据中截取当前所需要展示的那部分。实际上各种数据库都考虑到分页问题而内置了一些策略,比如MySql的LIMIT,Oracle的ROWNUM和ROW_NUMBER(),SqlServer的TOP和ROW_NUMBER(),基于此我们可以得到一系列分页的方法。
    1、 基于MySql的LIMIT和Oracle的ROWNUM,可以直接限制返回区间(以MySql为例,注意使用Oracle的ROWNUM时要应用子查询):

    方法一、直接限制返回区间
    1. SELECT * FROM table WHERE 查询条件 ORDER BY 排序条件 LIMIT ((页码-1)*页大小),页大小;
    复制代码
    优点:写法简单。
    缺点:当页码和页大小过大时,性能明显下降。
    适用:数据量不大。
    2、基于LIMIT(MySql)、ROWNUM(Oracle)和TOP(SqlServer),他们可以限制返回的行数,因此可以得到以下两套通用的方法(以SqlServer为例):

    方法二、NOT IN
    1. SELECT TOP 页大小 * FROM table WHERE 主键 NOT IN(    SELECT TOP (页码-1)*页大小 主键 FROM table WHERE 查询条件 ORDER BY 排序条件)ORDER BY 排序条件
    复制代码
    优点:通用性强。
    缺点:当数据量较大时向后翻页,NOT IN中的数据过大会影响性能。
    适用:数据量不大。
    方法三、MAX
    1. 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()
    1. SELECT TOP 页大小 * FROM (    SELECT TOP (页码*页大小) ROW_NUMBER() OVER (ORDER BY 排序条件) AS RowNum, * FROM table WHERE 查询条件) AS tempTableWHERE RowNum BETWEEN (页码-1)*页大小+1 AND 页码*页大小ORDER BY RowNum
    复制代码
    优点:在数据量较大时相比NOT IN有优势。
    缺点:小数据量时不如NOT IN。
    适用:大部分分页查询需求。
    到此这篇关于SQL实现分页查询方法总结的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持咔叽论坛。

    原文地址:https://www.jb51.net/article/232381.htm
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|RSS|藏宝游 ( 豫ICP备2021017492号 )|网站地图

    GMT+8, 2024-4-27 19:12 , Processed in 0.043075 second(s), 10 queries , Redis On.

    Powered by Discuz! X3.4

    本站不储存任何资源,所有资源均来自用户分享的网盘链接。
    本站为非盈利性站点,不会收取任何费用,所有内容不作为商业行为。

    快速回复 返回顶部 返回列表