除is [not] null之外,空值不滿足任何查找條件。
–如果null參與算術運算,則該算術表達式的值為null。
–如果null參與比較運算,則結果可視為false。在SQL-92中可看成unknown。
–如果null參與聚集運算,則除count(*)之外其它聚集函數都忽略null。
例:select sum(SAL)
from PROF
例:select count(*)
from PROF
–
詳細分析
SQL中的NULL值,表示不知道(UNKNOWN)的數據,用作不知道數據的具體值,或者不知道數據是否存在,或者數據不存在等情況。
因為引入了NULL值,故此SQL的邏輯系統是三值邏輯系統——FALSE、TRUE、NULL三種值構成的邏輯系統。
1、OR、AND、NOT真值表
A B A OR B A AND B NOT A
FALSE FALSE FALSE FALSE TRUE
FALSE TRUE TRUE FALSE -
FALSE NULL NULL FALSE -
TRUE FALSE TRUE FALSE FALSE
TRUE TRUE TRUE TRUE -
TRUE NULL TRUE NULL -
NULL FALSE NULL FALSE NULL
NULL TRUE TRUE NULL -
NULL NULL NULL NULL -
因為NULL當UNKNOWN來理解,因此,當值為NULL時,它既有可能是FALSE也有可能是TRUE。如果計算結果只有一種可能,則取該種可
能;如果計算結果既有可能是FALSE,也有可能是TRUE,那么結果便為NULL。例如,NOT NULL,其結果也有兩種可能,因此NOT NULL
的結果是NULL。再例如,NULL AND TRUE,則其結果也有兩種可能,因此NULL AND TRUE的結果是NULL。但是,NULL OR TRUE,或是
NULL AND FALSE,前者結果為TRUE,單是一個TRUE出現,便足以知道結果為TRUE;后者結果為FALSE,單是一個FALSE出現,便足以
知道結果為FALSE。這是OR和AND的特性決定的。
2、比較運算符及算術運算符中的NULL
比較運算符及算術運算符中的NULL,會導致運算結果也為NULL。如3+NULL的結果為NULL,NULL>=5的結果為NULL,等等。
3、BETWEEN AND、IN中的NULL
A BETWEEN B AND C意為A>=B AND A<=C,因此其產生NULL值的情況,可以參照后者判斷。A NOT BETWEEN B AND C相應等價於
NOT(A>=B AND A<=C)。
A IN(B,C,D)意為A=B OR A=C OR A=D,因此其產生NULL值的情況,可以參照后者判斷。A NOT IN(B,C,D)相應等價於NOT(A=B OR
A=C OR A=D)。當集合為空時,IN的結果為FALSE,NOT IN的結果則為TRUE。
4、EXISTS、IS NULL
EXISTS(以及NOT EXISTS)、IS NULL(以及IS NOT NULL),均只產生FALSE或TRUE,而不產生NULL。
5、ANY、ALL
在一個值與一個集合(一組值)比較時,比較運算符可以加上ANY(或SOME,作用相同)或ALL。
A>ANY(B,C,D)意為A>B OR A>C OR A>D,因此其產生NULL值的情況,可以參照后者判斷。當集合為空時,ANY的結果為FALSE。
A>ALL(B,C,D)意為A>B AND A>C AND A>D,因此其產生NULL值的情況,可以參照后者判斷。當集合為空時,ALL的結果為TRUE。
6、WHERE、HAVING、ON條件篩選,與完整性約束檢查
在WHERE、HAVING、ON條件篩選中,只保留結果為TRUE的,而不處理FALSE及NULL的。但在完整性約束檢查中,只有結果為FALSE
的,才違反約束檢查,NULL並不違反。
和NULL值相關的兩個函數
NULLIF:需要兩個參數
例子:NULLIF(a,b)
說明:如果a和b是相等的,那么返回NULL,如果不相等返回a
select NULLIF('eqeqweqwe','1') 結果是eqeqweqwe
select NULLIF(1,1) 結果是NULL
a和b的類型要一致
ISNULL:需要兩個參數
例子:ISNULL(a,b)
說明:如果a和b同時為NULL,返回NULL,如果a為NULL,b不為NULL,返回b,如果a不為NULL,b為NULL返回a,如果a和b都不為NULL
返回a
select ISNULL(null,null)結果是null
select ISNULL(null,33)結果是33
select ISNULL('ddd',null)結果是ddd
select ISNULL(44,33)結果是44
轉載自:http://blog.sina.com.cn/s/blog_6a6eb42d0100ka56.html