MySQL中order by语句对null字段的排序

默认情况下,MySQL将null算作最小值。

如果想要手动指定null的顺序,可以使用:

  将null强制放在最前:

    if(isnull(字段名),0,1) asc   //asc可以省略

  将null强制放在最后

    if(isnull(字段名),0,1) dsc

    if(isnull(字段名),1,0)  asc   //asc可以省略

对于这种使用方式的理解:

  以if(isnull(字段名),0,1)为例,它的意思是将该字段根据是否为null值分成两部分,值为null行相当于得到了一个隐含的排序属性0,值为非null的行相当于得到了一个隐含的排序属性1,在排序的时候,先根据这一隐含属性进行升序排列,因为if(isnull(字段名),0,1)相当于if(isnull(字段名),0,1) asc省略了asc而已,所以自然地,排序字段为null的那些行(隐含排序属性)会在最前。

  对于将null强制放在最后的语句的理解以此类推。

下面在MySQL 5.6上做一个测试:

测试的表的结构如下:

create table test
(
id int primary key auto_increment,
num int
);

表中已经有6条数据,分别为:

1.执行 :

select * from test order by num;

结果如下:

2.执行:

select * from test order by num desc;

结果如下:

第1、2步结果显示:默认情况下null为最小。

3.执行:

select * from test order by if(isnull(num),0,1),num;

结果如下:

4.执行:

select * from test order by if(isnull(num),0,1),num desc;

结果如下:

第3、4步结果显示:通过if(isnull(num),0,1),不管后面的num字段是升序还是降序,null值都被强制指定在最前。

5.执行:

select * from test order by if(isnull(num),1,0),num;

结果如下:

6.执行:

select * from test order by if(isnull(num),1,0),num desc;

结果如下:

第3、4步结果显示:通过if(isnull(num),1,0) ,不管后面的num字段是升序还是降序,null值都被强制指定在最后。

时间: 2024-10-20 21:17:43

MySQL中order by语句对null字段的排序的相关文章

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

与使用in时不同: 在使用in 时: SELECT COUNT(name) FROM CVE WHERE name NOT IN ('CVE-1999-0001', 'CVE-1999-0002'); SELECT COUNT(name) FROM CVE WHERE name NOT IN ('CVE-1999-0001', 'CVE-1999-0002',NULL); 二者结果相同; 在使用not in时: mysql> SELECT COUNT(name) FROM CVE WHERE n

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

MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的. 如果我们想让NULL排在后面,让非NULL的行排在前面该怎么做呢? MySQL数据库在设计的时候,如果字段允许NULL值,那么对该字段进行排序的时候需要注意那些值为NULL的行. 我们知道NULL的意思表示什么都不是,或者理解成"未知"也可以,它与任何值比较的结果都是false, 默认情况下,My

MySQL中order by的实现 和 by rand() 和优化

“MySQL 里面的order by rand()”是怎么实现的.我们今天来简单说说MySQL里的order by.    几种order by的情况             香格里拉娱乐城    乍一看这个问题好像有点复杂,我们从最简单的case开始看起.    用这个表来说明:(10w行数据) 1.  最简单的order ―― order by索引字段 从explain的结果来看(Extra列),这个语句并不作排序.因为字段a已经是有顺序的.就是按照索引a的顺序依次读pk的值(在这里是隐藏的

mysql中常用的语句整理

mysql中常用的语句: 1:创建带自增长的主键的表 DROP TABLE IF EXISTS user_login ; CREATE TABLE user_login (   user_id INT  UNSIGNED NOT NULL AUTO_INCREMENT,   user_name VARCHAR(50) DEFAULT NULL,   PRIMARY KEY user_id ) ENGINE=MYISAM  AUTO_INCREMENT=0  DEFAULT CHARSET=utf

索引优化来实现MySQL的ORDER BY语句优化

MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通过索引优化来实现MySQL的ORDER BY语句优化: 1.ORDER BY的索引优化.如果一个SQL语句形如: SELECT [column1],[column2],-. FROM [TABLE] ORDER BY [sort]; 在[sort]这个栏位上建立索引就可以实现利用索引进行order

mysql 中order by 与group by的顺序

mysql 中order by 与group by的顺序 是: select from where group by order by 注意:group by 比order by先执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效.要查出group by中最大的或最小的某一字段使用 max或min函数. 例: select sum(click_num) as totalnum,max(update_time) as upd

MySQL中order by排序时,数据存在null咋办

order by排序是最常用的功能,但是排序有时会遇到数据为空null的情况,这样排序就会乱了,这里以MySQL为例,记录我遇到的问题和解决思路. 问题: 网页要实现table的行鼠标拖拽排序,我用AngularJs集成了一个TableDnD开源插件,可以实现,然后在数据库表中增加一个排序字段indexId,但是原来的大量数据是没有排序过的,所以该字段为null. 这样order by时,为null的数据就会排在最前边. 写个测试表模拟一下,如下效果: 解决办法: 最优办法:利用MySQL中的一

Mysql中使用聚合函数对null值的处理

平时因为对于数据库研习的不深,所以在面试的时候问了一些平常遇到过的问题居然没法很肯定地回答出来,实在让自己很恼怒! 这次让我记忆深刻的一个问题是: 在mysql中使用聚合函数的时候比如avg(t),t是表中一个类型int型的字段,可为null,有三行数据,三行中的数据分别为:10,null,20,请问最后的结果是什么? 我的回答是15,在面试结束之后我尝试了一下结果没错,不过我对于聚集函数对null的处理貌似错了,我认为是聚合函数会将null值看作0,找了一番,博客中都认为是忽略null值,因为

MySQL中的replace语句

一.背景 当使用replace语句更新access_apps表时,原有的mark列.remark列的信息丢失. CREATE TABLE `access_apps` (   `base` varchar(11) NOT NULL DEFAULT '',   `business` varchar(64) NOT NULL DEFAULT '',   `owt` varchar(64) NOT NULL DEFAULT '',   `pdl` varchar(64) NOT NULL DEFAULT