跳到主要内容

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 组合的分页示例,以及深分页的性能问题