SQL分页查询

关于SQL语句分页,网上也有很多啦,我贴一部分过来,并且总结自己已知的分页到下面,方便日后查阅。

方法1: 适用于 SQL Server 2000/2005

SELECT TOP 页大小 *
 FROM table1
 WHERE id NOT IN
           (
           SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
           )
 ORDER BY id

方法2:
适用于 SQL Server 2000/2005

--顺序写法:
 SELECT TOP 页大小 *
 FROM table1
 WHERE id >=
 (
 SELECT ISNULL(MAX(id),0) 
 FROM 
 (
 SELECT TOP 页大小*(页数-1)+1 id FROM table1 ORDER BY id
 ) A
 )
 ORDER BY id
 
 --降序写法:
 SELECT TOP 页大小 *
 FROM table1
 WHERE id <=
 (
 SELECT ISNULL(MIN(id),0) 
 FROM 
 (
 SELECT TOP 页大小*(页数-1)+1 id FROM table1 ORDER BY id Desc
 ) A
 )
 ORDER BY id Desc

方法3:
适用于 SQL Server 2005

SELECT TOP 页大小 * 
 FROM 
         (
         SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
         ) A
 WHERE RowNumber > 页大小*(页数-1)

说明,页大小:每页的行数;页数:第几页。使用时,请把“页大小”和“页大小*(页数-1)”替换成数字。

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页)   效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用

 

<think>我们正在讨论SQL分页查询,特别是使用LIMIT和OFFSET的实现方法。根据用户的问题,他询问的是“SQL分页查询方法LIMITOFFSET实现”。根据之前的引用,我们知道:引用[1]和[3]展示了使用LIMIT和OFFSET的基本语法。引用[2]则提供了一种优化方法,通过子查询减少需要扫描的数据量。因此,我们可以先介绍基本的LIMITOFFSET方法,然后介绍优化方法。注意:用户要求使用中文回答,并且按照系统级指令,数学表达式和独立公式要正确使用LaTeX格式(但这个问题中可能用不到数学表达式,所以可以忽略)。另外,我们需要生成相关问题。回答结构:1.介绍基本的分页查询方法(使用LIMITOFFSET)2.分析这种方法的优缺点3.介绍一种优化方法(如引用[2]的方法)4.生成相关问题注意:在回答中引用的部分需要添加引用标识。</think>### SQL分页查询:LIMIT OFFSET 实现方法 在SQL中实现分页查询的核心方法是使用`LIMIT`和`OFFSET`子句,其基本语法如下: ```sql SELECT 列名 FROM 表名 ORDER BY 排序列 LIMIT 每记录数 OFFSET 起始偏移量; ``` #### 📌 基础实现步骤 1. **确定每记录数** 例如每显示10条记录:`LIMIT 10` 2. **计算偏移量** 偏移量 = (目标码 - 1) × 每记录数 例如第3(每10条):`OFFSET 20` 3. **完整查询示例** ```sql -- 获取第3数据(每10条) SELECT id, name, email FROM users ORDER BY registration_date DESC LIMIT 10 OFFSET 20; ``` #### ⚠️ 注意事项 1. **必须指定排序** 未使用`ORDER BY`会导致分结果不稳定[^3]。 2. **性能问题** `OFFSET N`需要扫描前N条记录,深度分时效率低下: ```sql -- 查询第50001(每10条)需扫描50万行 SELECT * FROM orders LIMIT 10 OFFSET 500000; ``` #### 🚀 优化方案 针对深度分的性能问题,推荐使用**游标分**(基于索引列): ```sql SELECT * FROM orders WHERE id > (SELECT id FROM orders ORDER BY id LIMIT 500000, 1) ORDER BY id LIMIT 10; ``` 此方法通过子查询直接定位起始位置,避免全表扫描[^2]。 #### 💡 应用场景对比 | **方法** | 适用场景 | 缺点 | |----------------|------------------------|---------------------| | LIMIT OFFSET | 浅层分(前100) | 深度分性能差 | | 游标分 | 深度分/实时数据 | 需连续有序的索引列 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值