讲师中心 微信公众号
AI工具推荐 视频效率加速

怎样在SQL中处理ORDER BY排序时NULL值的先后位置

大雪姑娘_4046

大雪姑娘_4046

发布时间:2026-09-08 08:19:17

|

1003人浏览过

|

来源于php中文网

原创

NULL默认位置不固定:PostgreSQL/Oracle/SQL Server默认ASC时排末尾、DESC时排最前,MySQL 5.7+默认ASC时排开头;必须用NULLS FIRST/LAST显式控制或CASE兜底确保跨库一致性。

怎样在sql中处理order by排序时null值的先后位置

ORDER BY 中 NULL 值默认排在哪? SQL 标准规定:NULL 被视为“未知值”,不等于任何值(包括它自己),在排序时**不参与大小比较**,而是由数据库实现决定其位置。绝大多数主流数据库(PostgreSQL、SQL Server、Oracle、SQLite)默认将 NULL 视为**最大值**,即 ORDER BY col ASC 时 NULL 排在最后,DESC 时排在最前。MySQL 是个例外:5.7 及之前版本默认把 NULL 当作**最小值**(ASC 时在最前),8.0+ 已对齐标准,但受 sql_mode 和存储引擎影响,行为仍可能不一致。

所以不能依赖“默认”,必须显式控制。

用 NULLS FIRST / NULLS LAST 显式指定位置 这是 SQL:2003 标准语法,PostgreSQL、Oracle、SQL Server(2012+)、SQLite(3.30+)都支持:
  • ORDER BY col ASC NULLS FIRST → NULL 永远排最前,无论升序降序
  • ORDER BY col DESC NULLS LAST → NULL 永远排最后
  • 注意:NULLS FIRST/LAST 必须写在方向关键字(ASC 或 DESC)之后,顺序不能颠倒

示例:

SELECT name, score FROM students ORDER BY score DESC NULLS LAST;

确保高分在前,没考的(score IS NULL)统一垫底,不会意外飘到顶部。

MySQL 和旧版 SQLite 怎么办? MySQL(尤其 5.7 及更早)和老 SQLite(NULLS FIRST/LAST,得用表达式绕过:
  • 让 NULL 变成一个极小/极大占位值,再排序:
    ORDER BY IFNULL(col, -999999) DESC(适用于数值)
  • 更通用安全的做法是用 CASE:
    ORDER BY CASE WHEN col IS NULL THEN 1 ELSE 0 END, col DESC
    → 先按是否为 NULL 分组(NULL → 1,非空 → 0),再按原字段排,这样 NULL 就能稳居末尾
  • 字符串字段同理:ORDER BY CASE WHEN name IS NULL THEN 'zzzzzz' ELSE name END,但要注意字符集和 collation 影响排序结果

注意:IFNULL() 和 COALESCE() 在索引上通常无法高效下推,可能导致全表扫描;而 CASE WHEN ... IS NULL 方式在某些场景下可利用索引(取决于优化器),但需实测执行计划。

ORDER BY 多字段时 NULL 行为会叠加吗? 会,但只作用于对应字段。比如:ORDER BY a ASC NULLS LAST, b DESC NULLS FIRST,a 字段的 NULL 全部沉底,同一组 a 非空值里,b 的 NULL 又会浮到该小组顶部。

容易被忽略的是:如果两个字段都有大量 NULL,且你没指定 NULLS 子句,不同数据库行为差异会直接导致分页结果错乱(比如第一页末尾和第二页开头出现重复或跳行)。线上分页查询涉及 ORDER BY 时,只要字段可能为 NULL,就必须显式声明 NULLS FIRST/LAST 或等效逻辑。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4823

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

991

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1269

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6861

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3543

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6840

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9501

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1290

2024.04.29

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn