Mysql 子查询中的非空值如何工作?

Mysql 子查询中的非空值如何工作?,mysql,Mysql,我对以下内容在MySQL中的工作方式感到困惑。在下面的查询中,第一个SELECT返回表2中的所有行,而第二个SELECT不返回任何行。是否解释了NULL如何与NOT IN运算符一起工作。是否有任何文件对此进行解释 CREATE TABLE table1 ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ); CREATE TABLE table2 ( id INT UNSIGNED NOT NULL AUT

我对以下内容在MySQL中的工作方式感到困惑。在下面的查询中,第一个
SELECT
返回表2中的所有行,而第二个
SELECT
不返回任何行。是否解释了
NULL
如何与
NOT IN
运算符一起工作。是否有任何文件对此进行解释

CREATE TABLE table1 (
   id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   PRIMARY KEY (id)
);

CREATE TABLE table2 (
   id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   table1_id INT UNSIGNED,
   PRIMARY KEY (id)
);

INSERT INTO table2 (id, table1_id) VALUES (1, NULL);

SELECT COUNT(*) FROM table2 WHERE table1_id NOT IN (SELECT id FROM table1);
+----------+
| COUNT(*) |
+----------+
|        1 |
+----------+

INSERT INTO table1 (id) VALUES (1);

SELECT COUNT(*) FROM table2 WHERE table1_id NOT IN (SELECT id FROM table1);
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+

原因是根据SQL规范,
Foo在(A,B,C)
中转换为
(Foo=A或Foo=B或Foo=C)
。因此,如果我们在(Null,1,2)中有
Foo,我们得到
Foo=Null或Foo=1或Foo=2
。由于
Foo=Null
总是
UNKNOWN
并且出于过滤目的计算为
False
,in表达式中的Null将不会返回任何结果。

原因是根据SQL规范,
Foo in(A,B,C)
转换为
(Foo=A或Foo=B或Foo=C)
。因此,如果我们在(Null,1,2)
中有
Foo,我们得到
Foo=Null或Foo=1或Foo=2
。由于
Foo=Null
始终是
UNKNOWN
且出于筛选目的计算为
False
,in表达式中的Null将不会返回任何结果。

您可以通过将id不为Null的
添加到subsquery@Bohemian-当然。但是,OP会特别询问为什么in子句中的NULL不返回结果。您可以通过将id不为NULL的
添加到subsquery@Bohemian-当然。但是,OP会特别询问为什么in子句中的NULL不返回任何结果。