我很困惑以下如何在MySQL中运行。在下面的查询中,第一个SELECT
返回table2
的所有行,而第二个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 |
+----------+
答案 0 :(得分:5)
原因是根据SQL规范,Foo IN(A,B,C)
转换为( Foo = A Or Foo = B Or Foo = C )
。因此,如果我们Foo In(Null, 1, 2)
,我们会得到Foo = Null Or Foo = 1 Or Foo = 2
。由于Foo = Null
始终为UNKNOWN
并且为了过滤而评估为False
,因此IN表达式中的空值将不会返回任何结果。