order by 默认是升序(asc),省略asc时行为一致;降序必须显式写desc;多字段排序方向独立,从左到右逐级生效;null位置因数据库而异,mysql默认最前,postgresql默认最后。

默认就是升序,ORDER BY column_name 不加 ASC 也完全等效。
ORDER BY 后不写 ASC 就是升序?
是的。SQL 标准规定 ORDER BY 的默认排序方向就是升序(ASC),显式写上 ASC 纯属冗余,除非是为了对称 DESC 或提升可读性。
-
SELECT * FROM users ORDER BY id和SELECT * FROM users ORDER BY id ASC行为完全一致 - 多数数据库(PostgreSQL、MySQL 8.0+、SQL Server、SQLite)都严格遵循该默认行为
- 老版本 MySQL(5.7 及之前)在某些模式下可能表现松散,但升序仍是事实默认
多字段排序时,每个字段都要单独指定 ASC/DESC?
必须。排序方向是按字段独立控制的,不会继承或默认传递。
-
ORDER BY status, created_at→status升序,created_at也升序 -
ORDER BY status DESC, created_at→status降序,created_at升序(因为没写DESC,默认升序) -
ORDER BY status ASC, created_at DESC→ 显式声明更安全,尤其当逻辑依赖顺序时
NULL 值在升序中排在哪?
取决于数据库实现,不是标准统一的——这是最容易踩坑的地方。
- PostgreSQL:NULL 默认排在**最后**(升序时)
- MySQL:NULL 默认排在**最前**(升序时)
- SQL Server:同 PostgreSQL,默认 NULL 最后
- 如果业务逻辑要求 NULL 固定位置(比如总要排最前),必须显式用
ORDER BY column IS NULL, column或NULLS FIRST/LAST(PostgreSQL/Oracle 支持,MySQL 不支持)
升序本身很简单,但跨数据库时 NULL 处理和多字段方向叠加容易出隐性偏差,上线前最好在目标环境实测一下空值排序结果。











