我刚刚发现你可以写类似的东西
SELECT NULL IS UNKNOWN
哪个返回1
。
还有其他地方可以使用UNKNOWN
吗?它似乎不是关键字(不能做SELECT UNKNOWN
)。NULL IS NULL
也是如此,那么有什么目的UNKNOWN
呢?
UNKNOWN
只是BOOLEAN
NULL
...的TRUE
别名_ _ _ _1
FALSE
0
BOOLEAN
TINYINT(1)
为什么它甚至在那里?因为它是 SQL-92 标准的一部分:
<truth value> ::=
TRUE
| FALSE
| UNKNOWN
为什么你可以SELECT NULL
,,,SELECT TRUE
却SELECT FALSE
不行SELECT UNKNOWN
?可能只是一个错误,因为UNKNOWN
直到更新版本的 MySql 才支持它本身。
在我看来,在 MySQL 中,UNKNOWN
是 的别名NULL
,用于布尔意义。
我可以找到这个参考:
在 SQL 中,所有逻辑运算符的计算结果为 TRUE、FALSE 或 NULL (UNKNOWN)。
有关一般 SQL NULL 和 UNKNOWN 的更多信息:
当受 NOT NULL 约束时,SQL BOOLEAN 的工作方式与其他语言中的布尔类型类似。然而,不受限制,BOOLEAN 数据类型,尽管它的名字,可以保存真值 TRUE、FALSE 和 UNKNOWN,所有这些都根据标准定义为布尔文字。该标准还断言 NULL 和 UNKNOWN “可以互换使用以表示完全相同的事物”。
它的唯一用途是描述一个没有已知值的布尔值。就像第一个例子说的那样,它相当于NULL
.
当比较涉及 NULL 时,在这种情况下,unknown
就会出现。
例如,考虑以下查询:
select* from tbl
where x>5
在这里,假设某些元组可能包含列的空值x
。现在,在评估每个元组时:
x>5
计算结果为 truex>5
计算结果为 falsex>5
计算结果是什么?(答案未知)对于案例 3,说真假中的任何一个都是错误的。因此,为了处理 case-3,sql 中存在另一个逻辑值,即unknown
.
(因此,sql中有3个逻辑值:真、假、未知)
现在,规则是:
如果一个元组的 where 子句谓词计算结果为 false 或 unknown,则该元组不会添加到结果中。
因此,对于上面的例子,只有 case-1 元组会被添加到结果中。
这样,SQL 在内部玩弄着unknown。
此外,当 where 子句谓词涉及多个逻辑表达式时,我们会得到一些结果:
true and unknown
是unknown
false and unknown
是false
unknown and unknown
是unknown
true or unknown
是true
false or unknown
是unknown
unknown or unknown
是unknown
not unknown
是unknown