本文介绍了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查询条件按排序条件限制排序的表((页码-1)*页面大小),页面大小;
优点:书写简单。
缺点:当页数和页面尺寸过大时,性能下降明显。
适用:数据量不大。
2、基于LIMIT(MySql)、ROWNUM(Oracle)和TOP(SqlServer),他们可以限制返回的行数,因此可以得到以下两套通用的方法(以SqlServer为例):
方法二、NOT IN
从主键不在的表中选择页面尺寸*
(
从查询条件按排序条件排序的表中选择(页码-1)*页面尺寸主键
)
按排序条件排序
优点:通用性强。
缺点:数据量大的时候翻页,in NOT IN的数据太大,会影响性能。
适用:数据量不大。
方法三、MAX
从查询条件和id的表格中选择页面尺寸*
(
SELECT ISNULL(MAX(id),0) FROM
(
从查询条件按id排序的表中选择((页码-1)*页面大小)id
)作为可尝试的
)
按id排序
优点:速度快,尤其是id是主键的时候。
缺点:适用范围窄,要求排序条件单一、可比。
适用:简单排序(特殊情况下也可以尝试转换为相似可比值处理)。
3、基于SqlServer和Oracle的ROW_NUMBER(),可以得到返回数据的行号,基于此在限制返回区间得到如下方法(以SqlServer为例):
方法四、ROW_NUMBER()
从中选择页面尺寸*
(
Select(页码*页面大小)ROW_NUMBER() OVER (ORDER BY排序条件)AS RowNum,* FROM table WHERE查询条件
)作为可尝试的
其中RowNum介于(页码-1)*页面大小1和页码*页面大小之间
按RowNum排序
优点:与不IN相比,在数据量较大时有优势。
缺点:数据量小的时候不如不在。
适用:大多数分页查询需求。
至此,本文对SQL分页查询方法的总结已经介绍到这里了。希望对大家的学习有帮助,也希望大家多多支持。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。