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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue调用手机相机相册_今天才发现,点一下小米手机相册,能将照片一键制作成电影...

随着国产手机的发展,手机像素越来越高,里面的功能也越来越丰富,手机拍照成了不少人的日常,如果你很爱拍照,手机里有一大堆照片,那么教你用手机自带的相册功能,一键将照片制作成电影,…

bzoj3389:[Usaco2004 Dec]Cleaning Shifts安排值班

思路:可以贪心,也可以最短路。 贪心写法:因为在保证合法的前提下,我们选择的区间一定要右端点尽量靠后才行,于是我们每次就选择一个合法的并且右端点最靠后的区间就好了(如果没有合法的输出-1即可&#xff…

unity 烘焙参数 设置_Unity通用渲染管线(URP)系列(九)——点光源和聚光灯

200篇教程总入口,欢迎收藏:放牛的星星:[教程汇总持续更新]Unity从入门到入坟——收藏这一篇就够了​zhuanlan.zhihu.com本文重点内容:1、支持更多类型的灯光2、包含实时的点光源和聚光灯3、为点光源和聚光灯烘焙阴影4、每个物体限…

c#日期转换周几_Java时间与日期

只有把眼前的事情做好,才能考虑其他的问题。众所周知,全世界在同一时刻看手表肯定不会看到同一个时间,因为地球是圆的,面对太阳的角度是不一样的,我们一般说时间几点几点,是指的本地时间,比如国…

Python开发之--前端 HTML基础

一:HTML介绍 HTML:超文本标记语言,标准通用标记语言下的一个应用。包括“头”部分(英语:Head)、和“主体”部分(英语:Body),其中“头”部提供关于网页的信息&…

给与用户建立dblink的权限_网络安全 之 NTFS安全权限

NTFS安全权限一、NTFS权限概述1、通过设置NTFS权限,实现不同的用户访问不同的权限2、分配了正确的访问权限后,用户才能访问其资源3、设置权限防止资源被篡改、删除二、文件系统概述 文件系统即在外部存储设备上组织文件的方法常用的文件系统:…

TCP 连接中的TIME_WAIT

原文:http://blog.csdn.net/wangpengqi/article/details/17245349 这就有个细节,一次http请求,谁会先断开TCP连接?什么情况下客户端先断,什么情况下服务端先断? 百度后,找到原因,主要…

丁丁打折网卷能用吗_微信群控还能用吗?现在什么群控还能使用吗?

微信群控系统还能用吗?为什么现在微信群控系统越来越被限制了呢?其实,微信群控我想在生活中占据着很大的位置!因为微信这么多的使用,现在微信使用人数都是几十亿了,所以很多人看重微信群控系统的市场&#…

错题整理

1.JAVA语言的下面几种数组复制方法中,哪个效率最高? A for循环逐一复制 B System.arraycopy C System.copyof D 使用clone方法 答案:B A、for循环的话,很灵活,但是代码不够简洁. for循环为什么慢,java中所…

xpath中两个冒号_爬虫学习(5)—XPath

之前我们写了一个简单的爬虫,在提取页面信息时我们使用正则表达式来匹配内容,但是正则表达式的书写比较繁琐,而且一旦错误就可能导致匹配失败。对于网页的节点来说,它可以定义id,class或其他的属性,而且节点…

Linux压缩与解压常用命令

欢迎和大家交流技术相关问题: 邮箱: jiangxinnju163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://www.zhihu.com/people/jiangxinnju tar的相关参数-c: 建立压缩档案-x:解压-t&…

mysql 预留一个自定义字段_MySQL 按指定字段自定义列表排序 | DevOps

问题描述大家都知道, MySQL 中按某字段升序排列的 SQL 为 (以 id 为例, 下同):SELECT * FROM MyTableWHERE id IN (1, 7, 3, 5)ORDER BY id ASC降序排列的 SQL 为:SELECT * FROM MyTableWHERE id IN (1, 7, 3, 5)ORDER BY id DESC有时以上排序并不能满足我们的需求. 例如, 我们…

canny算法的实现(android加载图片,数组写入文件换行)

Canny边缘检测首先要对图像进行高斯去噪,前面讲到了高斯去噪处理,这里从对图像灰度进行微分运算讲起吧。微分运算常用的方法是利用模板算子,把模板中心对应到图像的每一个像素位置,然后按照模板对应的公式对中心像素和它周围的像素…

python程序中想使用正则表达式_python中正则表达式的使用方法

本文主要关于python的正则表达式的符号与方法。findall: 找寻所有匹配,返回所有组合的列表search: 找寻第一个匹配并返回sub: 替换符合规律的内容,并返回替换后的内容.:匹配除了换行符以外的任意字符a xy123b re.findall(x...,a)print(b)# …

jQ实现JSON.stringify(obj)方法

jQstringify是使用jQuery实现的JSON.stringify(obj)方法代码如下&#xff1a;<script type"text/javascript" src"http://keleyi.com/keleyi/pmedia/jquery/jquery-1.10.2.min.js"></script>function jQstringify( obj ) {var arr [];$.each(…

解决问题的反馈机制_谈谈HBase中的Nonce机制

最近在读hbase源码关于rpc的一些实现细节&#xff0c;想正好趁此机会和大家分享一下我理解到的hbase关于Nonce机制的实现。Nonce机制的来源Nonce这个词由来已久&#xff0c;且在各个领域都会有相对应的名词解释。对于HBase来说&#xff0c;由于网络环境的复杂性&#xff0c;在客…

【VirtualBox】VirtualBox的桥接网络模式,为啥网络不稳定?

网桥模式访问外网非常慢&#xff0c;经常卡死&#xff0c;ping时断时续 七搞八搞&#xff0c;反复重启了几次 TMD 就好了&#xff0c;也不知道什么情况&#xff0c;VirtualBox还是不太好使啊。。。。。 网桥模式 设置 如下&#xff1a; 参考资料&#xff1a; http://blog.csdn…

白盒基本路径发测试实验报告_软件生命周期、白盒测试、黑盒测试

继上一讲&#xff1a;隅巳毕月&#xff1a;达摩克里斯之——排序与查找技术​zhuanlan.zhihu.com我们今天来讲一下软件周期与两种软件测试方法软件开发应遵循一个软件的生命周期&#xff0c;通常把软件产品从提出、实现、使用、维护到停止使用、退役的过程称为软件生命周期。软…

Windows7睡眠后自动唤醒

笔者的电脑&#xff08;Windows7 64位旗舰版&#xff09;睡眠后&#xff0c;隔段时间后会自动唤醒。经两项配置后&#xff0c;解决了该问题。 1 禁用唤醒定时器 控制面板里进入"电源选项""更改计划设置"界面&#xff0c;如下图所示 单击上图的"更改高…

bootstrap 两个轮播图冲突_为什么使用bootstrap在一个页面同时做两个轮播效果时,只有第一个有效??...

我们都知道使用bootstrap做轮播效果非常快&#xff0c;但是有时候一个页面会需要两个轮播&#xff1b;但这个时候再次使用bootstrap做轮播效果时就会失效&#xff1b;原因在于bootstrap的Carousel问题&#xff0c;只要修改一下id&#xff0c;就好了~~这是第一个轮播&#xff1a…