【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值索引優化的文章:
轉自:http://blog.csdn.net/smcwwh/article/details/6927613