1

我很困惑以下如何在 MySQL 中工作。在下面的查询中,第一个SELECT返回所有行,table2而第二个SELECT不返回任何行。是否有关于如何NULLNOT 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 |
+----------+
4

2 回答 2

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 表达式中的 Null 将不返回任何结果。

于 2012-06-29T02:53:17.903 回答
0

您可以添加IFNULL(id, '')到子查询以便它可以工作,例如:

SELECT COUNT(*) FROM table2 WHERE table1_id NOT IN (SELECT IFNULL(id, '') FROM table1);
于 2021-09-23T09:19:36.557 回答