MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的。 如果我们想让NULL排在后面,让非NULL的行排在前面该怎么做呢?

MySQL数据库在设计的时候,如果字段允许NULL值,那么对该字段进行排序的时候需要注意那些值为NULL的行。

我们知道NULL的意思表示什么都不是,或者理解成“未知”也可以,它与任何值比较的结果都是false,

默认情况下,MySQL会认为NULL值比其他类型的数据小, 也就是说,在order by排序的时候,NULL是最小的,ASC正序排序的话,NULL值是在最前面的。 如果我们想让NULL排在后面,让非NULL的行排在前面该怎么做呢?

下面我们通过一个小例子,来说明这个情况。

首先,创建一个测试数据表 test_user,

mysql> create table test_user(

id int unsigned not null auto_increment,

username varchar(10) not null,

age int,

primary key (id))

engine=myisam default charset=utf8 ;

Query OK, 0 rows affected (0.14 sec)

填充6条数据,其中3条设置了age值,另外3条age值为NULL

mysql> insert into test_user values(1,'user1',28),(2,'user2',30);

Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0

mysql> insert into test_user(username) values('user3'),('user4'),('user5');

Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0

mysql> insert into test_user values(6,'user6',23);

Query OK, 1 row affected (0.00 sec)

mysql> select * from test_user;

+----+-----------+------+ | id | username | age | +----+-----------+------+

| 1 | user1 | 28 |

| 2 | user2 | 30 |

| 3 | user3 | NULL |

| 4 | user4 | NULL |

| 5 | user5 | NULL |

| 6 | user6 | 23 |

+----+-----------+------+ 6 rows in set (0.00 sec)

我们按照age字段从小到大排序,我们看到NULL值是最小的,排在了最前面

mysql> select * from test_user order by age;

+----+-----------+------+ | id | username | age | +----+-----------+------+

| 3 | user3 | NULL | | 4 | user4 | NULL |

| 5 | user5 | NULL |

| 6 | user6 | 23 |

| 1 | user1 | 28 |

| 2 | user2 | 30 |

+----+-----------+------+ 6 rows in set (0.00 sec)

按照age字段从大到小排序,我们看到NULL值确实是最小的,排在了最后面

mysql> select * from test_user order by age desc;

+----+-----------+------+ | id | username | age | +----+-----------+------+

| 2 | user2 | 30 |

| 1 | user1 | 28 |

| 6 | user6 | 23 |

| 3 | user3 | NULL |

| 4 | user4 | NULL |

| 5 | user5 | NULL |

+----+-----------+------+ 6 rows in set (0.00 sec)

这里有个需要注意的事项,就是NULL值本身是无法排序的,也就是说一个NULL是无法和另外一个NULL比较的。 你可能已经发现了,那三个NULL值的行,不管正序还是倒序,顺序都是一致的,当然也可能不一致。

那如果在对age进行正序排序的时候,我们希望NULL值的记录在最后面显示,那该如何做呢?

1、重新生成一列,比如agenull,利用is null操作符,把NULL值的行变成1,非NULL值的行变成0,先对该字段排序,再对age排序

mysql> select *,age is null as agenull from test_user order by agenull,age; +----+-----------+------+---------+ | id | username | age | agenull | +----+-----------+------+---------+ | 6 | user6 | 23 | 0 | | 1 | user1 | 28 | 0 | | 2 | user2 | 30 | 0 | | 3 | user3 | NULL | 1 | | 4 | user4 | NULL | 1 | | 5 | user5 | NULL | 1 | +----+-----------+------+---------+ 6 rows in set (0.01 sec)

2、直接利用isnull函数对age列求值,跟第一种方法的道理是一样的

mysql> select * from test_user order by isnull(age),age; +----+-----------+------+ | id | username | age | +----+-----------+------+ | 6 | user6 | 23 | | 1 | user1 | 28 | | 2 | user2 | 30 | | 3 | user3 | NULL | | 4 | user4 | NULL | | 5 | user5 | NULL | +----+-----------+------+ 6 rows in set (0.00 sec)

3、还可以利用MySQL中的一个小技巧,在字段前面加上一个负号,也就是减号,ASC改成DESC ,DESC改成ASC

mysql> select * from test_user order by -age desc; +----+-----------+------+ | id | username | age | +----+-----------+------+ | 6 | user6 | 23 | | 1 | user1 | 28 | | 2 | user2 | 30 | | 3 | user3 | NULL | | 4 | user4 | NULL | | 5 | user5 | NULL | +----+-----------+------+ 6 rows in set (0.00 sec)

所以,在设计数据库的时候,如果某个字段要进行排序的话,最好不要为NULL。

来源: http://www.th7.cn/db/mysql/201606/195206.shtml
来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/jeffen/p/6044764.html

MySQL中order by中关于NULL值的排序问题相关推荐

  1. mysql对null排序_mysql中null值的排序问题分析_MySQL

    bitsCN.com mysql中null值的排序问题分析 如下表t_user: name age zhangsan 1 lisi NULL wangwu 2 执行一下sql: Sql代码 selec ...

  2. mysql不等于条件不包含NULL值问题

    mysql不等于条件不包含NULL值问题 table表中,type为1(100条记录).2(50条记录).NULL(50条记录) 查询:select * form table where type & ...

  3. mysql的order by_mysql中的order by

    一.order by的原理 1.利用索引的有序性获取有序数据 当查询语句的 order BY 条件和查询的执行计划中所利用的 Index 的索引键(或前面几个索引键)完全一致,且索引访问方式为 ran ...

  4. mysql 字段加减_Mysql数据清洗—Null值的处理技巧

    1:首先要了解为什么库中会存在Null值? 答:举个例子,市面上部分产品的的注册页会要求用户填写邀请码,这样邀请人才会得到奖励,如果用户注册的时候不是被其他人邀请注册的,那么无需填写邀请码,直接注册即 ...

  5. MySQL · 捉虫动态 · UK 包含 NULL 值备库延迟分析

    前言 在之前的月报 RDS 只读实例延迟分析 中,我们介绍了一些常见的备库延迟的场景,今天给大家分享一个比较少见的特殊场景. 简单的来说,就是在 UK 索引中存在大量 NULL 值情况下,如果备库选用 ...

  6. MySQL中NOT IN语句对NULL值的处理

    与使用in时不同: 在使用in 时: SELECT COUNT(name) FROM CVE WHERE name NOT IN ('CVE-1999-0001', 'CVE-1999-0002'); ...

  7. mybatisPlus中的updateById无法更新null值的字段

    https://blog.csdn.net/hui_hong_tailang/article/details/96478980

  8. oracle和mysql空字符串_Oracle数据库中对null值的排序及mull与空字符串的区别

    order by排序之null值处理方法在对业务数据排序时候,发现有些字段的记录是null值,这时排序便出现了有违我们使用习惯的数据大小顺序问题.在Oracle中规定,在Order by排序时缺省认为 ...

  9. sql如何处理null值_如何正确处理SQL中的NULL值

    sql如何处理null值 前言 (Preface) A friend who has recently started learning SQL asked me about NULL values ...

最新文章

  1. 图文解读:5 个刁钻的 String 面试题!
  2. php lvs,LVS(四)LVS集群DR模式
  3. 罐中研讨会:设置JBoss BPM Suite全天研讨会
  4. 【剑指offer】_14 不用加减乘除做加法
  5. CCNA-第十篇-VLAN-下
  6. 华为机试——坐标移动
  7. 商业智能让营销更精确
  8. Phoenix+Hbase二级索引
  9. 正则表达式(思维导图速查版)
  10. 三星emcp型号详解_三星emcp型号详解_eMCP终将成为过去式?解析:三星、美光所推出的uMCP为何物?......
  11. ctbs mysql_C/C++/Java
  12. 语音转写(讯飞开放平台)工具类
  13. 机器学习之多项式拟合
  14. python怎么打星号金字塔_python打印星号金字塔的方法_后端开发
  15. 数据分析 - 搭建数据监控体系(学习笔记)
  16. linux startx无效_Linux使用startx不能进入图形界面解决方案
  17. CSR867x — 如何修改蓝牙设备名称
  18. 工厂方法(整理自李建忠C++设计模式视频)
  19. 树莓派Pico直流电机接口技术及PWM电机调速控制MicroPython编程
  20. 计算机网络未来阶段发展趋势,计算机网络的未来发展趋势

热门文章

  1. 如何保持连接_工高连城 | 连接器连接失效的原因有哪些
  2. poj 1637 Sightseeing tour——最大流+欧拉回路
  3. 《精通Python设计模式》学习之原型模式
  4. OpenFileDialog 打开文件对话框
  5. java如何对List集合中的元素进行排序(请收藏)
  6. Linux安装Jenkins
  7. SQL的主键和外键约束 小记
  8. HDU 1402 A * B Problem Plus FFT
  9. Advanced C++ --- const function
  10. 第二周周四DailyReporting——PM(李忠)