MySQL NULL排序

作者admin

10月 1, 2024

在 MySQL 中,NULL 值的默认排序规则取决于排序方向(升序或降序)

对比

升序排序 (ASC) ↑

NULL 值在升序排序中被认为是最大的值。(从小到大排序)

所以,在升序排序的结果集中,NULL 值会排在最后。

降序排序 (DESC) ↓

NULL 值在降序排序中被认为是最小的值。(从大到小)

所以,在降序排序的结果集中,NULL 值会排在最前。

实战

CREATE TABLE example (id INT,value INT);

INSERT INTO example (id, value) VALUES (1, 10), (2, NULL), (3, 5), (4, NULL);

---------------------
| id  | value  |
---------------------
|  1  |  10    |
---------------------
|  2  |  NULL  |
---------------------
|  3  |  5     |
---------------------
|  4  |  NULL  |
---------------------

升序排序 (ASC) ↑

SELECT * FROM example ORDER BY value ASC;

id | value
1 | 10
3 | 5
2 | NULL
4 | NULL

降序排序 (DESC) ↓

SELECT * FROM example ORDER BY value DESC;

id | value
2 | NULL
4 | NULL
1 | 10
3 | 5

实战

odrde by value DESC排序,NULL放最后

方法1、

SELECT id ,value FROM test ORDER BY ISNULL(value) ASC, value DESC;

方法2、

SELECT id ,value FROM test ORDER BY COALESCE(value , 0) DESC

方法3、

SELECT id ,value FROM test ORDER BY CASE WHEN age IS NULL THEN 1 ELSE 0 END ASC, value DESC

ISNULL vs COALESCE vs CASE WHEN

ISNULL

  • 简单,适用于只需判断一个字段是否为 NULL 并进行排序的场景。

使用场景:

只能处理单一的 NULL 检查,并且仅适用于将 NULL 值放在最后或最前的场景。

COALESCE

  • 可以用来替换 NULL 值为一个自定义的默认值(例如 0-1 等),非常灵活。
  • 语法简单,适合处理多个字段并对其进行排序。

使用场景:

  • 当你希望将 NULL 排序为某个特定值(如最小值或最大值)时,且排序逻辑较简单时。

SELECT * FROM users ORDER BY COALESCE(age, -1) DESC;

COALESCE(age, -1) 将 NULL 值替换为 -1,然后按降序排列

CASE WHEN

  • 灵活性高,能够处理更复杂的逻辑。
  • 可以根据自定义的条件对 NULL 和非 NULL 值进行复杂的排序。

使用场景:

复杂排序逻辑,或者当你需要更多自定义条件时,例如根据多个字段或多个 NULL 检查进行排序。

推荐

  • 如果你的需求比较简单,只需处理 NULL 排序并将其放在最后或最前,可以使用 ISNULLCOALESCE
  • 如果你的排序条件涉及多个复杂的逻辑判断,或者需要根据多个条件来处理 NULL,使用 CASE WHEN 会更灵活

https://www.49855.net/mysql-isnull

https://www.49855.net/mysql-coalesce

作者 admin

百度广告效果展示