为什么0结果在“where not in”查询中

时间:2015-05-12 21:09:23

标签: mysql where-in mysql-5.6

mysql> show columns in m like 'fld';
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| fld   | varchar(45) | YES  | MUL | NULL    |       |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.02 sec)

mysql> show columns in i like 'fld';
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| fld   | varchar(45) | YES  | MUL | NULL    |       |
+-------+-------------+------+-----+---------+-------+
1 row in set (0.02 sec)

mysql> select count(distinct fld) from i;
+---------------------+
| count(distinct fld) |
+---------------------+
|               27988 |
+---------------------+
1 row in set (0.03 sec)

mysql> select count(distinct fld) from m;
+---------------------+
| count(distinct fld) |
+---------------------+
|               72558 |
+---------------------+
1 row in set (0.07 sec)

根据我对相关表格的了解,上述结果似乎是合理的。

mysql> select count(*) from m where fld not in (select fld from i);
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.11 sec)

最后的结果似乎不合理。 m中的There must be fld中的某些行,i不在0!有人可以解释为什么我得到mysql> select count(*) from m where fld is null; +----------+ | count(*) | +----------+ | 0 | +----------+ 1 row in set (0.00 sec) 作为结果吗?

为了完整性(因为我怀疑它可能是相关的),我也会粘贴这个结果:

select count(*) from m join i using (fld)

编辑:在回复评论时,我正在编辑以下信息,以防有人回答我的问题:

  • left join收益9350;与right join,73087;与select count(*) from i where fld is null,28872。
  • {{1}}收益810。

1 个答案:

答案 0 :(得分:1)

我现在已经明白了。 The documentation读到:

  

为符合SQL标准,IN不仅返回NULL左侧的表达式为NULL,而且如果列表中未找到匹配项,则返回NULL列表中的表达式是fld not in

因此,not fld in(即not null)只要在派生表格中出现null,就会返回null(即fld)在这里)并且在派生表中找不到(select fld from i where fld is not null)(这是我正在测试的)。

可能有一个比这更好的解决方法,但我使用{{1}}。