我們在sql中要查詢某列值為null的所有結果集時,查詢條件應該這樣寫
select * from 表 where 字段 is null
而使用select * from 表 where 字段 = null是查不到正確的結果的。那這是為什么呢?要清楚為什么,就需要了解sql中的三值邏輯了。
在SQL中邏輯表達式的可能值包括TRUE、FALSE和UNKNOWN,它們被稱之為三值邏輯。
我們知道,在其它的語言中,邏輯表達式只有兩種,要么是true,要么就是false。而sql中卻存在第三個邏輯表達式UnKnown,這個是sql中特有的。從字面意思上我們可以解理該值的意思是:什么都不知道,就是什么都不是。一般情況下我們將任何值(包括NULL本身)與NULL做比較的時候,都會返回UnKnown。而在查詢表達式中(比如where與having中),UnKnown會視為false。所以我們就明白了為什么select * from 表 where 字段=null查不到正確的結果的原因了。
但並不是在所有場情下UnKnown都會視為false來處理,在check約束中,UnKnown就會視為true來處理。這就是為什么我們設置某個字段的值必須大於等於0的情況下,我們還可以往該字段中插入Null值,那是因為在check約束中null>=0的邏輯結果UnKnown會被當作true來處理。
需要注意的是,在分組子句與排序子句中,sql視null是相等的
即:
1,GROUP BY會把所有NULL值分到一組。
2,ORDER BY會把所有NULL值排列在一起。
(轉)