当存在空值时,Mysql不返回值在子查询中

时间:2016-06-11 13:15:49

标签: php mysql sql

我有两个表 table1 table2 。其内容如下

mysql> select id from table1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

mysql> select id from table2;
+------+
| id   |
+------+
|  301 |
|    2 |
| NULL |
+------+
3 rows in set (0.00 sec)

当我在mysql控制台中点击下面的查询时,它总是返回空集

select id 
from table1 
where id 
not in (select id from table2);

空集(0.00秒)

如果子查询中存在空值,是否存在 不在中会出现故障....?

我已使用以下查询

解决了这个问题
select id 
from table1 
where id 
not in (select id from table2 where id is not null);
+------+
| id   |
+------+
|    1 |
|    3 |
|    4 |
+------+

设置3行(0.00秒)

只想知道

提前致谢:)

编辑:This question尝试清除空气但不够

1 个答案:

答案 0 :(得分:4)

这就是not in的工作原理。我建议您改为使用not exists

select id 
from table1 t1
where not exists (select 1 from table2 t2 where t1.id = t2.id);

为什么not in以这种方式工作?这是因为not in的语义。请记住,SQL中的NULL(通常)表示未知值。因此,如果你有一个"(1,2)"你可以说" 3"不在列表中。如果你有"(1,2,未知)"你不能这么说。相反,结果为NULL,将其视为false。

NOT EXISTS不会这样,所以我觉得使用起来更方便。