默認情況下,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 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;
結果如下:
第5、6步結果顯示:通過if(isnull(num),1,0) ,不管后面的num字段是升序還是降序,null值都被強制指定在最后。