當我們使用order by
來為指定的字段進行排序時,如果db中該字段的值存在著null值,那麼在排序時這些null值會不會參與排序呢?如果參與排序的話,又是以怎樣的標準來排序?
在不同的db中,對於null值的預設值不同。
如果對乙個學生表裡的資料按照age欄位進行順序排序,如下:
select * from student order
by age
如果name欄位存在null值,那麼這條sql的結果集就如下所示:
|id|student|age|
|1|小明|10|
|2|小紅|12|
|3|小黑|null|
|4|小白|null|
因為null值預設是最大,所以在公升序排列中null值的記錄就會被排到最後。同樣地,如果是降序排列,null值記錄就會被排到最前面。
oracle中同樣認為null值最大,也就是說,公升序排列時null值預設排在最後;降序排列時null值預設排在最前。
mysql和sqlserver則相反,null值預設是最小。當公升序排列時null值預設排在最前;降序排列時null值預設排在最後。
在實際的業務中,null值參與的排序這可能會造成一些不必要的問題,有時候甚至會造成乙個bug並且難以被發現。
所以,在對這些有可能存在null值的字段進行排序時需要注意使用關鍵字nulls last/first
。
我們可以通過nulls last
或者nulls first
關鍵字來指定這些null值的record是排在最後還是最前,如下:
select * from student order
by age desc nulls last;
該語句指定了降序排列時,null值排到最後;需要注意的是,該關鍵字只能搭配order by來使用。一共也就四種用法:
mysql 空值排序問題
postgresql 資料庫null值的預設排序行為與查詢、索引定義規範 - nulls first\last, asc\desc
Mysql 排序null值 排序問題分析
mysql中null值的排序問題分析 如下表t user name age zhangsan 1 lisi null wangwu 2 www.2cto.com 執行一下sql sql select from t user order by age name age lisi null zhangs...
mapreduce對key值排序問題
最近在學習mapreduce程式設計遇到很多用mr實現按某一列值排序,或二次排序的類似問題,於是試著用mr實現各種排序問題,最終有點小總結 無需在key物件之外寫任何排序函式,mr會完成按key值排序,具體詳解如下 在這之前要先說一下writablecomparable介面。writable介面大家...
空值排序與時間倒敘問題
單獨將空值排序在最後 select from users us order by us.create time nulls last 單獨將空值排序在最前 select from users us order by us.create time nulls first 時間倒敘 select fro...