SQL排序由ORDER BY显式声明、索引匹配及collation协同决定;多字段按书写顺序逐级嵌套排序;需避免低区分度字段前置;ASC可省略但DESC必须显式;NULL位置须显式控制;中文排序应依赖collation或预存拼音字段;索引字段顺序须与ORDER BY完全一致才能免FileSort。

SQL排序规则不是靠“设置”一次就全局生效的,而是通过 ORDER BY 子句显式声明 + 排序列索引 + 数据库级排序规则(collation)协同作用 来实现的。真正影响排序结果和性能的关键,是写法是否合理、索引是否存在、以及底层 collation 是否匹配业务需求。
多字段排序要理清优先级
数据库严格按 ORDER BY 后字段的**书写顺序**逐级排序:先比第一列,值相同时再比第二列,依此类推。这不是并行比较,而是嵌套判断。
- 正确写法:
ORDER BY status ASC, created_at DESC—— 先归类状态,同类里按时间倒序排最新在前 - 别把低区分度字段放前面,比如
ORDER BY is_deleted, id:95%数据 is_deleted=0,几乎全表走第二级排序,索引效果大打折扣 - 升序(ASC)可省略,降序(DESC)必须显式写出,避免歧义
NULL值处理不能靠默认
不同数据库对 NULL 的默认位置不一致:MySQL 升序时 NULL 在最前,PostgreSQL 和 Oracle 默认在最后。生产环境必须显式控制,否则分页或前端展示容易错乱。
- 标准写法(PostgreSQL/Oracle):
ORDER BY amount NULLS LAST - MySQL 兼容写法:
ORDER BY ISNULL(amount), amount—— 把 NULL 当作 1 排最前,非 NULL 当作 0 排后面 - 如需统一逻辑,建议在应用层补空值(如用 0 或 'N/A' 替代 NULL),比 SQL 层兜底更稳定
中文排序得靠 collation 或预计算
直接 ORDER BY name 对中文只是按 Unicode 码点排,结果是“八、匕、丁、七…”,不符合读音或笔画习惯。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~