标准 sql 中排序降序关键字是 desc 而非 descending;所有主流数据库仅支持 desc,且必须紧接列名后、不可加括号;默认升序(asc),null 处理因数据库而异,需显式指定 nulls first/last 以保证一致性。

DESCENDING 不是标准 SQL 关键字,用 DESC 才对
很多刚写 SQL 的人会误以为 DESCENDING 是合法的排序关键字,结果执行时报错,比如 PostgreSQL 报 syntax error at or near "DESCENDING",MySQL 或 SQLite 直接不识别。标准 SQL 规范里只有 DESC(ASC 的反义缩写),没有 DESCENDING 这个词。所有主流数据库(PostgreSQL、MySQL、SQL Server、SQLite、Oracle)都只认 DESC。
正确写法:在 ORDER BY 后紧跟 DESC
DESC 必须紧贴列名之后,中间不能换行或加括号,也不能单独成词放在别处。它只修饰紧邻的前一个排序项。
-
SELECT * FROM users ORDER BY created_at DESC;✅ 正确 -
SELECT * FROM users ORDER BY created_at DESCENDING;❌ 语法错误 -
SELECT * FROM users ORDER BY created_at DESC, name ASC;✅ 多字段混合排序没问题 -
SELECT * FROM users ORDER BY (created_at DESC);❌ 括号非法,DESC不是函数参数
不写 DESC 时默认行为因数据库而异,但通常不是你想要的
省略排序方向时,SQL 标准规定默认是 ASC(升序),绝大多数数据库也遵守这点。但要注意:
- 某些旧版或嵌入式数据库(如部分 SQLite 编译变体)可能受编译选项影响,默认行为不一致
- 如果字段是索引覆盖列且查询优化器选择了逆向扫描,结果看起来像倒序,但这不是语义保证,不可依赖
- 显式写
DESC不仅避免歧义,还能让执行计划更可预测——例如 PostgreSQL 会优先尝试使用created_at DESC方向的索引
排序 NULL 值时,DESC 的行为容易被忽略
倒序下 NULL 的位置不是固定的:不同数据库默认把 NULL 当作“最大值”还是“最小值”处理,会导致结果不一致。
- PostgreSQL 默认
NULLS LAST(DESC时NULL排最后) - SQL Server 和 MySQL 默认
NULLS FIRST(DESC时NULL排最前) - 想跨数据库统一行为?必须显式加
NULLS FIRST或NULLS LAST(注意:SQLite 不支持该语法) - 示例:
ORDER BY status DESC NULLS LAST在 PostgreSQL 和 Oracle 中有效,在 MySQL 中会报错
真正要靠住的,是 DESC 这两个字母,不是拼写更长的词;而真正容易出问题的,往往不是方向本身,而是 NULL 在不同引擎里的隐身规则。











