SQL三值謂詞邏輯
2012-01-09 20:34 海不是藍 閱讀(1055) 評論(2) 收藏 舉報NULL值
Sql的NULL值表示缺失的值。它使用的是三值謂詞邏輯。
三值謂詞邏輯
平時我們都是習慣使用二值邏輯(TRUE,FALSE)來進行思考,二值邏輯的計算結果不是TRUE就是FALSE。但是SQL中涉及到了NULL值,那么TRUE,FALSE就不夠用了,這個時候二值邏輯已經不能支持NULL的出現。所以三值謂詞邏輯就登場了。
定義
TRUE,FALSE,NULL(UNKNOWN),如果邏輯表達式只涉及已經存在的值時,那么最終的計算結果要么為TRUE,要么為FALSE,但是當邏輯表達式涉及缺少的值時,其計算結果就是UNKNOWN。
實際存在的值和NULL做比較,得到的結果是UNKNOWN。
*接受TRUE,拒絕FALSE和UNKNOWN。
*拒絕FALSE,接受TRUE和UNKNOWN。
看個示例:

select * from Test where age>12

這里只接受age大于12的列,拒絕那些age小于12或者age等于NULL的列。
當age=NULL的時候,NULL>12計算的結果是UNKNOWN。
age<12或者=12都是同理。
補充:
UNKNOWN取反仍然是UNKNOWN
5>10=TRUE,5<10=FALSE
5>NULL OR 5<NULL OR 5=NULL 都是UNKNOWN
|
表達式 |
接受的列 |
拒絕的列 |
|
Age>10 |
Age>10=TRUE的列 |
Age<=10和Age=NULL的列 |
|
Age<10 |
Age<10=TRUE的列 |
Age>=10和Age=NULL的列 |
|
Age=10 OR >= <= <> 原理同上,接受TRUE,拒絕FALSE和UNKNOWN。 |
||
特別介紹 EXISTS和IN
===EXISTS和IN之間的區別===
1.EXISTS只返回TRUE或FALSE,不會返回UNKNOWN。
2.IN當遇到包含NULL的情況,那么就會返回UNKNOWN。
重點:
當查詢的列包含NULL時,NOT EXISTS正常返回TRUE或FALSE。
而NOT IN可能返回空集,如下
1:val IN(val1,val2,...,NULL),永遠不會返回FALSE,而是返回TRUE或UNKNOWN。
2:val NOT IN(val1,val2,...,NULL),永遠不會返回TRUE,而是返回NOT TRUE或NOT UNKNOWN。
看個示例:
Test表

Test1表

select t.[name] from Test as t
where exists (select t1.orderid from Test1 as t1 where t1.[name]=t.[name])
返回 aaa,ccc,ddd
select t.[name] from Test as t
where t.[name] in (select t1.[] from Test1 as t1)
返回 aaa,ccc,ddd
select t.[name] from Test as t
where not exists (select t1.orderid from Test1 as t1 where t1.[name]=t.[name])
返回 bbb
select t.[name] from Test as t
where t.[name] not in (select t1.[name] from Test1 as t1)
返回空集
|
運算符 |
返回值 |
|
a IN (a,b) |
TRUE |
|
a IN (b,c) |
FALSE |
|
a NOT IN (a,b) |
FALSE |
|
a NOT IN (b,c) |
TRUE |
|
a IN (a,b,NULL) |
TRUE |
|
a IN (b,c,NULL) |
UNKNOWN |
|
a NOT IN (a,b,NULL) |
UNKNOWN |
|
a NOT IN (b,c,NULL) |
UNKNOWN |
|
a EXISTS(a,b) |
TRUE |
|
a EXISTS(b,c) |
FALSE |
|
a NOT EXISTS(a,b) |
FALSE |
|
a NOT EXISTS(b,c) |
TRUE |
|
a EXISTS(a,b,NULL) |
TRUE |
|
a EXISTS(b,c,NULL) |
FALSE |
|
a NOT EXISTS(a,b,NULL) |
FALSE |
|
a NOT EXISTS(b,c,NULL) |
TRUE |
浙公網安備 33010602011771號