MYSQL、SQL Server、Oracle數據庫排序空值null問題及其解決辦法

【sqlserver】:mysql

sqlserver 認爲 null 最小。 sql

升序排列:null 值默認排在最前。數據庫

要想排後面,則:order by case when col is null then 1 else 0 end ,coloracle

降序排列:null 值默認排在最後。函數

要想排在前面,則:order   by case when col is null then 0 else 1 end , col descsqlserver

【oracle】:測試

oracle認爲 null 最大。 優化

升序排列,默認狀況下,null值排後面。spa

降序排序,默認狀況下,null值排前面。.net

有幾種辦法改變這種狀況:

(1)用 nvl 函數或decode 函數 將null轉換爲一特定值

(2)用case語法將null轉換爲一特定值(oracle9i之後版本支持。和sqlserver相似):
order by (case mycol when null then '北京漂客'     else   mycol   end)

(3)使用nulls first 或者nulls last 語法。

這是oracle專門用來null值排序的語法。

nulls first :將null排在最前面。如:select * from mytb order by mycol nulls first

null last :將null排在最後面。如:select * from mytb order by mycol nulls last

若是要想讓含有null的列按照本身的意願進行排序,可作如上處理。

【mysql】:

MySQL同sqlserver,null默認最小,解決辦法同sqlserver


注意:
一、null的列做爲查詢條件時,不管使用>/</>=/<=都是不符合條件的,只能使用isNull來判斷。以下:


id爲4的age字段爲空,

執行SQL:select * from student where age >= 30; 結果以下:

執行SQL:select * from student where age < 30; 結果以下:


只有執行SQL:select * from student where age is null; 才能查詢出age爲null的數據。

二、對null作加、減、乘、除等運算操做,結果仍爲空

剛開始student表數據以下:

執行SQL:update student set age = age + 20;

執行SQL:select * from student; 結果以下:

非null的age字段都更新爲+20,而null字段依然爲空。


上面的測試數據庫爲MySQL,Oracle也同樣。SQL Server沒測試過,應該也是同樣的。


空值
列能夠接受或拒絕空值。在數據庫內 NULL 是特殊值,表明未知值的概念。NULL 不一樣於空字符或 0。空字符其實是有效字符,0 是有效數字。而 NULL 只是表示該值未知這一律念。NULL 也不一樣於零長度字符串。若是列定義中包含 NOT NULL 子句,則不能爲該行插入含有 NULL 值的行。若是列定義中僅包含 NULL 關鍵字,則接受 NULL 值。

在列內容許 NULL 值會增長使用該列的邏輯比較的複雜性。SQL-92 標準規定:對 NULL 值的任何比較都不取值爲 TRUE 或 FALSE,而是取值爲 UNKNOWN。此規定在比較運算符中引入了三值邏輯,而要正確運用該邏輯很困難。[摘自Microsoft SQLServer聯機叢書]


SQL中null值索引優化的文章:

【摘】SQL優化:NULL值與索引的使用

轉自:http://blog.csdn.net/smcwwh/article/details/6927613

相關文章
相關標籤/搜索