mysql - 为什么 'WHERE NOT' 与 NULL 行不起作用?

标签 mysql sql where-clause

也许我只是错过了一些东西。由于问题太不具体,无法通过谷歌/搜索来查找,因此我现在在这里寻求帮助。在 MySQL

中测试

我的问题:为什么此 SELECT 不输出 [ id=2 ]?

SELECT `id` FROM `testtable1` WHERE NOT (`key_boolean` = 1);

表定义和测试数据:

CREATE TABLE IF NOT EXISTS `testtable1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`key_boolean` tinyint NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=1;

INSERT INTO `testtable1` (`key_boolean`) VALUES (1);
INSERT INTO `testtable1` () VALUES ();

表中现在存储:

<表类=“s-表”> <标题> id key_boolean <正文> 1 1 2 NULL

编辑: 根据这些答案,我实际上在 StackOverflow 上发现了更多类似的问题。这篇文章非常适合 MySQL:MYSQL syntax not evaluating not equal to in presence of NULL

最佳答案

表达式key_boolean = 1计算结果为 NULLkey_booleanNULL 。所以你中间有 NOT NULL对于 NOT (key_boolean = 1)NOT NULL反过来,也计算为 NULL 。又如 NULL不为 true(但也不为 false — 在 SQL 中 ternary logic 适用),则不会选择该行。

除少数情况外,所有比较操作,如 = ,评估为NULL ,如果它们的操作数之一是 NULL 。在本例中,MySQL 中一个值得注意的异常(exception)是 NULL -safe equal <=> ,其行为就像您可能想要的那样。

您可以从测试表中选择(子)表达式并亲自查看它们的结果。

SELECT *,
       key_boolean = 1,
       NOT (key_boolean = 1),
       key_boolean <=> 1,
       NOT (key_boolean <=> 1)
       FROM testtable1;

db<>fiddle

关于mysql - 为什么 'WHERE NOT' 与 NULL 行不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70601488/

相关文章:

MySQL - JOIN 的嵌套选择语句?

javascript - 请将回调函数的事件路径分解为ORM文件

c++ - 如何确保 SqLite 中的只读事务?

php - 从多个用户提供的 MySQL 搜索提供 where 子句 - 修复和更好的算法

sqlite - 从 SQLite 正确选择以前的日期

Mysql DELETE Where 1=1 AND 2=2

MySQL : Get name after registered name

Windows 服务器上的 php

java - jOOQ - DSL.dateAdd 与 Field<Timestamp>

MySQL 更新正在将其他行中的选定列设置为零