(转载)如何用一条sql取得第10到第20条的记录?

本文介绍了在SQL中实现特定范围记录获取的三种方法,包括利用NOT IN排除前10条记录来获取第11到20条记录的方法,通过创建临时表并使用自增ID来定位记录的方法,以及通过两次TOP查询结合ORDER BY进行高效分页的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为id可能不是连续的,所以不能用取得10<id<20的记录的方法。

有三种方法可以实现:
一、搜索前20条记录,指定不包括前10条
语句:
select top 20 * from tbl where id not in (select top 10 id from tbl)
二、搜索记录生成临时表,建立临时表的自增id。通过取得自增id的10<id<20的记录的方法取得所需数据
语句:
select identity(int,1,1) as id,* into #temp from tbl;
select * from #temp where id between 10 and 20
第二个方法实际上是两条语句,但你可以让他连续执行,就像一条语句一样完成任务。

三、朋友们觉得第一种方法效率太低,经过讨论,得出第三种方法:
语句:
SELECT TOP 10 * FROM (SELECT TOP 20 * FROM tblORDER BY id) as tbl2 ORDER BY tbl2.id DESC


原文地址:http://www.cnblogs.com/gofficer/archive/2008/01/09/1031333.html
<think>好的,我现在需要帮助用户解决在达梦数据库中如何实现查询第11到第20记录的分页问题。首先,我得回忆一下达梦数据库的分页语法。之前接触过不同的数据库,比如MySQL用的是LIMIT和OFFSET,Oracle用ROWNUM,而达梦作为国产数据库,可能有自己的实现方式。 用户之前询问过分页查询的案例,之前的回答涵盖了MySQL、PostgreSQL、Oracle等,但这次是达梦。我需要确定达梦的具体分页方法。可能达梦支持标准的SQL语法,或者有自己特有的关键字。查阅资料发现,达梦通常使用LIMIT ... OFFSET,类似于MySQL,但需要确认语法是否正确。例如,是否支持在LIMIT后面直接跟两个参数,或者需要其他写法。 另外,用户提到查询第11到第20,即每页10,第二页。根据分页公式,OFFSET应该是(2-1)*10=10,LIMIT是10。所以正确的SQL应该是SELECT * FROM 表名 ORDER BY 排序列 LIMIT 10 OFFSET 10。但需要确认达梦是否支持这种写法。 可能存在的误区是,用户可能混淆了LIMIT和OFFSET的位置。例如,在MySQL中LIMIT 10 OFFSET 10和LIMIT 10,10是等价的,但达梦是否也这样?另外,达梦的文档是否提到必须使用其他方式,比如子查询或者特定的函数? 还需要考虑是否需要排序,因为分页必须要有确定的顺序,否则结果可能不稳定。所以在SQL中必须包含ORDER BY子句。此外,索引的使用情况也会影响性能,特别是当数据量大的时候,需要确保排序列有索引。 另外,用户可能有更深层次的需求,比如处理大数据量时的性能优化。达梦是否支持类似MySQL的“游标分页”方法,即使用WHERE件基于上一页的最后一条记录来避免OFFSET?例如,SELECT * FROM 表 WHERE id > 上一页最后ID ORDER BY id LIMIT 10。这种方法在达梦中是否适用? 还需要注意达梦数据库的版本,不同版本可能有不同的语法支持。如果用户使用的是较新版本,可能支持标准的LIMIT/OFFSET,而旧版本可能需要其他方法。比如,有些数据库可能需要使用ROW_NUMBER()窗口函数来实现分页。 假设用户使用的是较新的达梦版本,支持LIMIT和OFFSET,那么给出的示例应该是正确的。但需要提醒用户注意排序和性能问题,以及不同数据库之间的语法差异。同时,可能需要提供一个完整的示例,包括建表、插入数据、查询分页,以帮助用户更好地理解。 总结来说,步骤应该是: 1. 确定达梦数据库的分页语法,确认是否支持LIMIT OFFSET。 2. 构建正确的SQL语句,包含ORDER BY以确保顺序。 3. 提供示例,包括参数计算和可能的优化建议。 4. 对比其他数据库,说明差异,帮助用户理解。 5. 提醒注意事项,如索引、性能、深分页问题等。 现在需要验证这些思路是否正确。查阅达梦官方文档或可靠资料,确认分页语法。假设确认达梦确实使用LIMIT和OFFSET,那么回答的结构应该是先说明基本语法,然后给出示例,再讨论优化和注意事项。</think>在达梦数据库(DM8)中实现分页查询,主要使用`LIMIT ... OFFSET`语法或`TOP`语法。以下是具体实现方案: --- ### **一、基础分页查询** #### 1. 标准分页写法(推荐) ```sql SELECT * FROM 表名 ORDER BY 排序列 -- 必须指定排序 LIMIT 10 OFFSET 10; -- 查询第11-20(每页10,第2页) ``` #### 2. 等效写法(兼容MySQL风格) ```sql SELECT * FROM 表名 ORDER BY 排序列 LIMIT 10, 10; -- 语法:LIMIT offset, limit ``` --- ### **二、参数说明** | 参数 | 计算方式 | 示例值(第2页,每页10) | |------------|---------------------------|--------------------------| | **OFFSET** | (页码-1) * 每页数 | (2-1)*10 = 10 | | **LIMIT** | 每页数 | 10 | --- ### **三、完整案例演示** #### 1. 创建测试表 ```sql CREATE TABLE employee ( id INT PRIMARY KEY, name VARCHAR(50), salary DECIMAL(10,2) ); ``` #### 2. 插入测试数据 ```sql INSERT INTO employee VALUES (1, '张三', 8000), (2, '李四', 12000), ... (30, '王三十', 15000); ``` #### 3. 分页查询第2页数据 ```sql SELECT * FROM employee ORDER BY id ASC -- 按ID升序排序 LIMIT 10 OFFSET 10; -- 第11-20记录 ``` --- ### **四、性能优化方案** #### 1. 索引优化 ```sql CREATE INDEX idx_employee_id ON employee(id); -- 为排序字段创建索引 ``` #### 2. 深度分页优化(替代`OFFSET`) ```sql SELECT * FROM employee WHERE id > 20 -- 假设上一页最后一条记录的id=20 ORDER BY id LIMIT 10; ``` --- ### **五、达梦特有语法** #### 1. `TOP`语法实现分页(适用于旧版本) ```sql SELECT TOP 10 * --10 FROM ( SELECT TOP 20 * -- 取前20 FROM employee ORDER BY id ASC ) AS tmp ORDER BY id DESC; -- 反转结果 ``` #### 2. 窗口函数实现(通用性强) ```sql SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn FROM employee ) AS t WHERE rn BETWEEN 11 AND 20; ``` --- ### **六、对比其他数据库** | 数据库 | 分页写法 | |-------------|-------------------------------------| | **达梦** | `LIMIT 10 OFFSET 10` 或 `TOP`语法 | | MySQL | `LIMIT 10 OFFSET 10` | | Oracle | `ROWNUM`结合子查询 | | PostgreSQL | 同MySQL | --- ### **七、注意事项** 1. **强制排序**:必须使用`ORDER BY`保证分页稳定性 2. **索引匹配**:排序字段需与索引匹配,避免全表扫描 3. **参数校验**:前端需验证页码数值有效性(如`page>0`) 4. **总数统计**:分页查询需配合`SELECT COUNT(*)`获取总记录--- 通过上述方案,可以在达梦数据库中效实现分页查询。建议优先使用`LIMIT/OFSET`标准语法,在需要兼容旧版本时使用`TOP`或窗口函数方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值