繁体   English   中英

MySQL-从in in语句中选择

[英]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.IDBookNULL值引起的。 您可以通过两种简单的方法对其进行修复。 第一个是:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM