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。
MySQL中order by中关于NULL值的排序问题的更多相关文章
- SQL order by 语句对null值排序
记order by 语句对null值排序: 目录 记order by 语句对null值排序: MySQL: Oracle: SqlServer: MySQL: 将null值放在最后 select * ...
- Mysql中使用聚合函数对null值的处理
平时因为对于数据库研习的不深,所以在面试的时候问了一些平常遇到过的问题居然没法很肯定地回答出来,实在让自己很恼怒! 这次让我记忆深刻的一个问题是: 在mysql中使用聚合函数的时候比如avg(t),t ...
- SpringBoot项目中处理返回json的null值
在后端数据接口项目开发中,经常遇到返回的数据中有null值,导致前端需要进行判断处理,否则容易出现undefined的情况,如何便捷的将null值转换为空字符串? 以SpringBoot项目为例,SS ...
- Oracle使用order by排序关于null值处理
select * from dual order by age desc nulls last select * from test order by age asc nulls first sqls ...
- MySQL中NOT IN语句对NULL值的处理
与使用in时不同: 在使用in 时: SELECT COUNT(name) FROM CVE WHERE name NOT IN ('CVE-1999-0001', 'CVE-1999-0002'); ...
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
- mysql sql中的一些问题,Null与空字符
mysql中的空值,NULL,空字符 Mysql数据库是一个基于结构化数据的开源数据库.SQL语句是MySQL数据库中核心语言.不过在MySQL数据库中执行SQL语句,需要小心两个陷阱. 陷阱一:空值 ...
- SqlServer中的Null值空值问题
sql使用的是三值谓词逻辑,所以逻辑表达式返回的结果可以为True.False或者未知,在三值逻辑中返回True与不返回False并不完全一样, SQL对查询过滤条件的处理:接受TURE 拒绝FAL ...
- mysql null值处理详细说明
在讲null之前,我们先看一个例子 表数据如下: 3306>select * from t1; +------+-------+ | id | name | +------+-------+ | ...
随机推荐
- 读metronic文档学到的几个知识点
1.RTL 同样的页面,它做了两套.为什么,因为在这个世界上,有些民族,有些语种,是从右向左来的. 2. google material design 同样的一套东西,又分别做了google mat ...
- 学习iOS的一些网站收藏
1,CocoaChina:http://www.cocoachina.com/ 2,Code4App:http://code4app.com/ 3,梦维:http://www.dreamingwish ...
- 2003服务器断开rdp后会自动注销。
开始-运行-gpedit.msc-计算机配置-管理模板-Windows Components-Terminal Services-Sessions-Set time limit for disconn ...
- input子系统详解
一.初识linux输入子系统 linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler).输入子系统核心层(Inpu ...
- MySQL二进制日志的备份和恢复
二进制日志:记录数据库修改的相关操作,作用是即时点回复,主从复制 可以按时间滚动,也可以按大小滚动 server-id:服务器身份标识 一.二进制文件的删除方法,千万不要手动删除 PURGE BINA ...
- php常用配置(php.ini)
查看php配置文件的位置 # /usr/local/php/bin/php -i | head php配置文件中的注释是用;号 1.disable_functions(php要禁用的函数) phpin ...
- Codeforces Round #128 (Div. 2)
A. Two Problems 分两题的过题情况讨论,并且数值均不大,暴力枚举. B. Game on Paper 每次给格子染色后,考虑当前格子在正方形中的位置,然后判断对应的正方形是否都已染色. ...
- 修改host文件屏蔽视频广告和网站
很多时候我们会需要屏蔽一些网站或者广告,类似XX网站,下木马病毒的网站,或者破解软件的时候.我们可以使用一些软件屏蔽,我这里是用windows系统自带的hosts文件来屏蔽的.这个文件有点类似精简版的 ...
- windows下多个python版本共存
方法/步骤 首先当然是安装你需要的两个不同版本的python,这里我安装的是2.7和3.3的,两个版本安装顺序无所谓. 接下来就是检查环境变量,缺少的我们需要添加.先找到环境变量的位置. ...
- 【转】db/dbm
db,表示一个相对值.当计算A的功率相比于B大或小多少个dB时,可按公式10lg A/B计算.例如:A功率比B功率大一倍,那么10lg A/B = 10 lg 2 = 3dB,也就是说,A的功率比B的 ...