面试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
相关产品推荐
相关产品推荐

