You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

面试SQL问题:按唯一标识字段排序后取出第101条记录

解法说明与具体实现

这问题其实挺常见的,核心就是排序+精准分页,而且要求用唯一标识字段排序是关键——能避免排序不稳定导致的结果偏差,毕竟我们要精准拿到第101条记录。下面分几种主流数据库给你具体实现方案:

1. MySQL / MariaDB

用LIMIT语法即可,逻辑是跳过前100条,只取第101条:

SELECT *
FROM your_table
ORDER BY unique_identifier_field -- 替换成你的唯一标识字段,比如主键id、业务唯一uuid等
LIMIT 100, 1;

理由:LIMIT offset, count里的offset代表要跳过的记录数,我们要取第101条,就得跳过前100条,再取1条。用唯一字段排序能保证每次执行的排序结果完全一致,不会出现同一条记录位置波动的情况。

2. PostgreSQL

PostgreSQL支持语义更清晰的OFFSET + FETCH写法:

SELECT *
FROM your_table
ORDER BY unique_identifier_field
OFFSET 100 ROWS
FETCH NEXT 1 ROW ONLY;

理由:OFFSET 100明确跳过前100条记录,FETCH NEXT 1 ROW ONLY精准获取下一条,和MySQL的LIMIT逻辑一致,但可读性更强。同样依赖唯一字段排序确保结果稳定。

3. SQL Server

分新版本和老版本两种写法:

2012及以后版本(推荐):

SELECT *
FROM your_table
ORDER BY unique_identifier_field
OFFSET 100 ROWS
FETCH NEXT 1 ROW ONLY;

2008及之前老版本:

SELECT *
FROM (
    SELECT *,
           ROW_NUMBER() OVER (ORDER BY unique_identifier_field) AS row_num
    FROM your_table
) AS numbered_rows
WHERE row_num = 101;

理由:新版本的OFFSET/FETCH和PostgreSQL语法一致;老版本用窗口函数ROW_NUMBER()给每条记录按唯一字段排序后编号,直接筛选编号为101的记录即可,同样能保证排序的确定性。

4. Oracle

Oracle需要注意ROWNUM的特性,推荐用窗口函数或者嵌套子查询实现:

窗口函数写法(更直观):

SELECT *
FROM (
    SELECT *,
           ROW_NUMBER() OVER (ORDER BY unique_identifier_field) AS row_num
    FROM your_table
)
WHERE row_num = 101;

ROWNUM嵌套写法:

SELECT *
FROM (
    SELECT *
    FROM your_table
    ORDER BY unique_identifier_field
)
WHERE ROWNUM = 101;

理由:Oracle的ROWNUM是在结果集生成后分配的,所以必须先完成排序的子查询,再在外层筛选ROWNUM=101;窗口函数的写法逻辑更直白,同样依赖唯一字段排序避免结果偏差。

核心注意事项
  • 务必用唯一标识字段排序:如果用非唯一字段排序,可能出现多条记录排序后位置不确定的情况,导致每次取的第101条不一样。唯一字段(比如主键、唯一索引字段)能保证排序结果绝对稳定。
  • 性能优化建议:如果表数据量很大,给排序的唯一字段加索引,数据库可以直接利用索引排序,不用全表扫描,大幅提升查询速度。

内容的提问来源于stack exchange,提问作者Prashant Shelake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:11:54