MySQL使用order by column asc排序时,column值存在null,排在最前面

  • Post author:
  • Post category:mysql




1.前言

最近在使用order by column排序时,本以为很自然的一个排序语句,没想到最后结果却出乎意料,导致没达到想要的排序结果。

在这里插入图片描述

不知道大家有没有遇到过这种情况哈,就是order by column,但是column中存在null值,这时候null会被排在最前面,然后才是根据column值的大小排序。下面我们来复现一下这种情况。



2.出现场景

create table order_test(
   id bigint primary key auto_increment comment '主键',
   ranking int comment '排名'
);
insert into order_test(ranking) values (null),(2),(3),(null),(1);

这时,我们测试表中的数据为:

在这里插入图片描述

此时,我们来测试一下排序:

select id,ranking from order_test order by ranking

得到的结果为下图所示:

在这里插入图片描述

可以看到,null值排在了最前面,这并不是我们想要的排序结果,我们所期望的是,有值的按照大小顺序排序,null值排在最后面。



3.问题原因

那么为什么会出现这样的现象,经过查询MySQL官方文档,了解到在MySQL中,MySQL将null值视为小于任何非null值。这是

参考链接

,有兴趣可以进行查阅。

在这里插入图片描述



4.解决方案

我们可以利用isnull(expr)函数的特性,If expr is NULL, ISNULL() returns 1, otherwise it returns 0。如果表达式的值为null则返回为1,否则返回0。

select isnull(ranking), id ,ranking from order_test;

在这里插入图片描述

这时我们可以利用isnull(ranking)对其进行排序,因此可以衍生出我们的解决思路:根据

isnull(ranking),ranking

进行排序。

select id ,ranking from order_test order by isnull(ranking), ranking;


排序结果



在这里插入图片描述

到此,问题顺利解决。

在这里插入图片描述

欢迎大家一起交流学习。


最后,欢迎关注微信公众号一起交流



版权声明:本文为weixin_43834401原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。