博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL分页查询总结{转}
阅读量:7171 次
发布时间:2019-06-29

本文共 1476 字,大约阅读时间需要 4 分钟。

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

简单说来方法有两种,一种在源上控制,一种在端上控制。源上控制把分页逻辑放在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 tempTableWHERE RowNum BETWEEN (页码-1)*页大小+1 AND 页码*页大小ORDER BY RowNum

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

缺点:小数据量时不如NOT IN。
适用:大部分分页查询需求。

转载地址:http://cvbzm.baihongyu.com/

你可能感兴趣的文章
抽象工厂例子
查看>>
sublime text 3 安装
查看>>
java final keyword
查看>>
怎么在spring官网上下载spring的jar包, 源代码和文档?
查看>>
StringUtilsd的isEmpty、isNotEmpty、isBlank、isNotBlank
查看>>
Objective-C类的使用
查看>>
IE无法打开internet网站已终止操作的解决的方法
查看>>
基于jQuery商品分类选择提交表单代码
查看>>
解读ASP.NET 5 & MVC6系列(4):核心技术与环境配置
查看>>
CDT+Eclipse代码自动提示
查看>>
shell 下执行mysql 命令
查看>>
[PHP] - PDO事务操作
查看>>
完美解决VMware Workstation : Could not open /dev/vmmon: No such file or directory
查看>>
SharePoint 2010用“localhost”方式访问网站,File not found问题处理方式
查看>>
【转】安卓手机有安全模式?安卓4.1安全模式介绍
查看>>
利用bat批处理做启动mongodb脚本
查看>>
C#中一道关于多线程的基础练习题——模拟仓库存销过程
查看>>
杭州驾校模拟考试
查看>>
qmake的使用
查看>>
MySql 命令行
查看>>