PostgreSQL ORDER BY 排序教程
ORDER BY 子句决定查询 结果的返回顺序。没有 ORDER BY 时,PostgreSQL 不保证任何返回顺序——同样的 SQL 在不同执行计划下结果顺序可能不同。
本篇内容
- 单列与多列排序(ASC / DESC)
- NULLS FIRST / NULLS LAST
- 按列别名、表达式或列序号排序
- 排序与 LIMIT / OFFSET 分页的配合
基本写法
-- 按创建时间倒序(最新在前)
SELECT id, name, create_time FROM users ORDER BY create_time DESC;
-- 多列排序:先按状态升序,再按创建时间倒序
SELECT id, name, status, create_time FROM users
ORDER BY status ASC, create_time DESC;
NULL 的排列位置
PostgreSQL 认为 NULL 大于所有非空值:升序时 NULL 在后,降序时 NULL 在前。可以用 NULLS FIRST / NULLS LAST 显式控制:
-- 升序,NULL 放最前
SELECT name, age FROM users ORDER BY age ASC NULLS FIRST;
-- 倒序,NULL 放最后
SELECT name, age FROM users ORDER BY age DESC NULLS LAST;
待补充(TODO)
- 补充:哪些排序能走索引、何时会引入额外排序节点(结合 EXPLAIN 说明)
- 补充:排序规则(collation)对中文、大小写排序的影响
- 补充 :按表达式或列序号(ORDER BY 1)排序的写法与可读性取舍
- 补充:与 LIMIT / OFFSET 组合的分页示例,以及深分页的性能问题