在 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
排序并将其放在最后或最前,可以使用ISNULL
或COALESCE
。 - 如果你的排序条件涉及多个复杂的逻辑判断,或者需要根据多个条件来处理
NULL
,使用CASE WHEN
会更灵活
https://www.49855.net/mysql-isnull
https://www.49855.net/mysql-coalesce