我们来利用is null把sql给稍微改造一下即可;
1
2
3
4
5
6
7
8
9
10
11
mysql>select *from bjy_orderorder by order_numberis null,order_numberasc;
+----+------+--------------+
| id | city | order_number |
+----+------+--------------+
| 2 | 上海 | 1 |
| 5 | 天津 | 2 |
| 1 | 北京 |NULL |
| 3 | 广州 |NULL |
| 4 | 河北 |NULL |
| 6 | 河南 |NULL |
+----+------+--------------+
默认情况下,MySQL将null算作最小值。如果想要手动指定null的顺序,可以使用:
1.将null强制放在最前:
if(isnull(字段名),0,1) asc //asc可以省略
2.将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 tabletest
(
id int primary keyauto_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;
结果如下:
第5、6步结果显示:通过if(isnull(num),1,0) ,不管后面的num字段是升序还是降序,null值都被强制指定在最后。