[英]MySQL - Select from with not in statement
我对MySQL有一个非常奇怪的情况。 我有2张桌子。 第一个表具有列ID(主键),并具有约560 000行。 第二个表具有IDBook列(来自ID列的第一个表的行),具有约259 000行。
如果我尝试从第一个表中搜索
SELECT * FROM testovoe_zadanie_poisk_knig.book
where id=66764
然后返回一行。
如果我尝试从第二张表搜索
SELECT * FROM testovoe_zadanie_poisk_knig.autors
where IDBook=66764
然后返回0行。
没关系。
但。 如果我执行SQL脚本
SELECT count(b1.id) FROM testovoe_zadanie_poisk_knig.book b1
where b1.id not in (
select IDBook
from `testovoe_zadanie_poisk_knig`.`autors`
)
然后返回0。
为什么?
您的IDBook
列是否具有null
值?
尝试这个:
SELECT COUNT(b1.id)
FROM testovoe_zadanie_poisk_knig.book b1
WHERE b1.id NOT IN (
SELECT IDBook
FROM `testovoe_zadanie_poisk_knig`.`autors`
WHERE IDBook IS NOT NULL
)
此问题通常是由autors.IDBook
的NULL
值引起的。 您可以通过两种简单的方法对其进行修复。 第一个是:
SELECT count(b1.id)
FROM testovoe_zadanie_poisk_knig.book b1
WHERE b1.id not in (select a.IDBook
from `testovoe_zadanie_poisk_knig`.`autors` a
where a.IDBook is not NULL
);
第二种是使用`NOT EXISTS:
SELECT count(b1.id)
FROM testovoe_zadanie_poisk_knig.book b1
WHERE NOT EXISTS (select a.IDBook
from `testovoe_zadanie_poisk_knig`.`autors` a
where b1.id = a.IDBook
);
带有NULL
值的NOT IN
的语义有点违反直觉。 如果子查询中的任何值为NULL
,则查询将显示“我不知道列表中是否有给定值”。 因此,它返回NULL
,将其视为false。 这是ANSI标准行为,并非特定于MySQL。
NOT EXISTS
表单具有您期望的语义。 如果子查询中的值为NULL
,则将其忽略。 基于这个原因,我(和其他人)通常建议NOT IN
使用这种类型的比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.