ORDER BY是日常开发中最常用的 SQL 子句之一,但在遇到 NULL 空值、需要将特定行置顶或置底时,不同数据库的默认行为差异常常让人踩坑。
本文系统梳理 MySQL、Oracle、SQL Server、PostgreSQL 四种主流数据库在 ORDER BY 场景下的处理方式与最佳实践,助你写出可移植、可维护的排序 SQL。
一、为什么 ORDER BY 的"边角料"值得重视
在业务系统中,以下场景你一定不陌生:
- 列表页按创建时间倒序,但还没填写创建时间的记录(NULL)要么全部堆在最前面、要么全部沉到底部,产品经理说"应该放到最后"。
- 下拉选项中,"全部""其他""请选择"这类占位项需要置顶,其他选项按字母或编码排序。
- 报表数据中,"合计行"这一条必须放在表格最底部,而不是被排序规则打乱。
- 审批流列表中,"草稿"状态的单据要置顶显示,"已归档"的要沉底,中间是正常流程。