NOT IN子查询如何使用NULL值?

时间:2012-06-29 02:50:25

标签: mysql

我很困惑以下如何在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 |
+----------+

1 个答案:

答案 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表达式中的空值将不会返回任何结果。