NOT IN的奇怪行为

Wea*_*Fox 6 mysql sql

我有这张桌子:

select count(distinct clean_deep_link) from tbl_1;
+---------------------------------+
| count(distinct clean_deep_link) |
+---------------------------------+
|                          121211 |
+---------------------------------+
Run Code Online (Sandbox Code Playgroud)

我有这个问题:

select count(1) from tbl_1 where clean_deep_link IN
  (select clean_deep_link from tbl_2);

+----------+
| count(1) |
+----------+
|    66360 |
+----------+
Run Code Online (Sandbox Code Playgroud)

但是当我将查询更改为not in它时,返回一个空集:

select count(1) from tbl_1
where clean_deep_link not in (select clean_deep_link from tbl_2);
+----------+
| count(1) |
+----------+
|        0 |
+----------+
Run Code Online (Sandbox Code Playgroud)

这怎么可能?如果子查询包含大约一半的记录,那么子查询中是否应该not包含另一半?我在这里错过了什么?

谢谢

Pet*_*ang 9

我认为这tbl_1.clean_deep_linkNULL其余的行.

这些值既不INNOT IN您的子查询也不是您的子查询.


另一个原因可能是,你有NULLtbl_2.clean_deep_link.

请尝试以下方法:

select count(1) from tbl_1
where clean_deep_link not in (select clean_deep_link
                              from tbl_2 WHERE clean_deep_link IS NOT NULL);
Run Code Online (Sandbox Code Playgroud)

问题NULL在于它既不是=,也不是<>任何其他价值(包括NULL).

在检查时NOT IN,MySQL需要检查每个值,tbl_1因为它不包含在内tbl_2,因此检查它们是否存在<>.

你的价值观没有 <> NULL,所以他们没有 NOT IN.

另请参阅:使用带空值的NOT IN运算符


检查SQL Fiddle中的示例.