提问人:Fred Phish 提问时间:2/7/2023 最后编辑:Fred Phish 更新时间:2/7/2023 访问量:152
VALUE是IS NOT NULL MySQL的快捷方式吗?
IS !value a shortcut for IS NOT NULL MySQL?
问:
在使用 MySQL 时,我注意到如果我运行
SELECT * FROM table WHERE !value;
返回与以下内容相同的内容
SELECT * FROM table WHERE value IS NOT NULL;
该表为“employees”,列为“MiddleInitial”(字符串)。 因此,我得到了 MiddleInitial 不为 null 的所有员工。
这是恰当的速记还是巧合?我想知道这是否是一种安全的写作方式?我似乎找不到任何关于这方面的信息。
我期待
SELECT * FROM table WHERE !value;
返回所有 null 值。奇怪
SELECT * FROM table WHERE value;
不返回任何内容。
答:
不,不是。
这似乎是因为它正在执行类型强制以强制列中的任何内容为布尔值。 当强制作为布尔谓词时,值将强制转换为,并且大多数非 null 列值将强制为 。但是某些列值(不为 null)也会强制转换为 。NULL
false
true
false
您可以在此处查看示例:
请注意,最后一个示例缺少该行。另请注意前面的那一行不包括该行,这让我怀疑您的服务器可能设置了用于非标准空处理的选项。0
null
下面是一些其他示例:
请注意行的处理方式。'1'
评论
在 SQL 中,与 不同。NULL
false
否定不是,它仍然是.NULL
true
NULL
mysql> select null;
+------+
| NULL |
+------+
| NULL |
+------+
mysql> select !(null);
+---------+
| !(null) |
+---------+
| NULL |
+---------+
可以看作是“未知”的值。如果某条信息是未知的,那么如何知道它的反面呢?它不能——相反的情况也是未知的,因为我们不知道我们是从什么开始的。NULL
当在子句条件中使用时,行为或多或少类似于,因为两者都不是严格意义上的。只有条件所在的行才会成为查询结果集的一部分。WHERE
NULL
false
true
true
还有其他值的作用类似于MySQL:false
mysql> select 1 where '';
Empty set (0.01 sec)
mysql> select 1 where 0;
Empty set (0.01 sec)
MySQL有点不标准,因为布尔值和实际上分别与整数值1和0相同(这不是大多数其他品牌的SQL数据库中布尔值的实现方式)。true
false
这些值不是 ,因此可以否定它们,您可以将它们的对立面视为 。NULL
true
mysql> select 1 where !0;
+---+
| 1 |
+---+
| 1 |
+---+
mysql> select 1 where !'';
+---+
| 1 |
+---+
| 1 |
+---+
如上所述,该运算符在 MySQL 8.0 中已弃用。它不是标准的 SQL,使用它会使您的代码不如使用更明确的语言(如 或)清晰。!
IS NOT NULL
<>
评论
!FALSE
返回 1,返回 0,即作为 .并返回 1,并返回 0。!TRUE
NOT
!0
!1