NULL值影响查询条件的结果,并且结果很微妙。
以下是SQL中AND,OR,NOT的真值表。
表1 AND的真值表
|
[b]TRUE[/b]
|
[b]FALSE[/b]
|
[b]NULL[/b]
|
|
[b]TRUE[/b]
|
TRUE
|
FALSE
|
NULL
|
|
[b]FALSE[/b]
|
FALSE
|
FALSE
|
FALSE
|
|
[b]NULL[/b]
|
NULL
|
FALSE
|
NULL
|
表2 OR的真值表
|
[b]TRUE[/b]
|
[b]FALSE[/b]
|
[b]NULL[/b]
|
|
[b]TRUE[/b]
|
TRUE
|
TRUE
|
TRUE
|
|
[b]FALSE[/b]
|
TRUE
|
FALSE
|
NULL
|
|
[b]NULL[/b]
|
TRUE
|
NULL
|
NULL
|
表3 NOT的真值表
|
[b]TRUE[/b]
|
[b]FALSE[/b]
|
[b]NULL[/b]
|
|
FALSE
|
TRUE
|
NULL
|
当两个以上的查询条件与AND、OR、NOT组合时,NOT的优先级最高,其次是AND,最后是OR。为了避免歧义和确保可移植性最好使用括号。
A[b]BETWEEN[/b] B[b]AND[/b] C 等价于 (A>=B)[b]AND[/b] (A<=C),因此根据真值表可以得出BETWEEN 子句中处理NULL值的规则。
同样,A[b]IN[/b](B,C,D) 等价于 (A=B)[b]OR[/b](A=C)[b]OR[/b](A=D), 根据真值表,只要这三个表达式中有一个为NULL,结果返回肯定是NULL。
因此,[b]BETWEEN子句和
IN子句[/b]并不增加SQL语句的表达能力。
SQL 中有[b]NULL [/b]值测试,即:[b]字段[/b] [b]IS (
NOT[/b]) NULL ,但它的返回结果只有两种情况:TRUE或者FALSE。