你可以在同一个查询中使用 NOT IN 和 NOT EXISTS 吗?

Posted

技术标签:

【中文标题】你可以在同一个查询中使用 NOT IN 和 NOT EXISTS 吗?【英文标题】:Can you use NOT IN and NOT EXISTS in the same query? 【发布时间】:2015-08-23 10:17:05 【问题描述】:

理论上,您能否将 NOT IN 和 NOT EXISTS 用作同一查询的一部分,或许在子查询中?

【问题讨论】:

是的,你可以,SELECT * FROM mytable WHERE col NOT IN ('a', 'b') AND NOT EXISTS (SELECT * FROM anothertable WHERE anothertable.col2=mytable.col2) 【参考方案1】:

是的,你可以。

WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type) and stores.store_type NOT IN(...);

【讨论】:

【参考方案2】:

当然可以,但请注意两者在空 (NULL) 属性方面的区别。在那里你可能会得到混合的结果。当子查询返回一个空值时,NOT IN 将不会匹配任何行。

可以通过查看 NOT IN 操作实际含义的详细信息来找到其原因。

假设为了便于说明,表中有 4 行称为 t,有一个称为 ID 的列,其值为 1..4

WHERE SomeValue NOT IN (SELECT AVal FROM t)

等价于

WHERE SomeValue != (SELECT AVal FROM t WHERE ID=1)
  AND SomeValue != (SELECT AVal FROM t WHERE ID=2)
  AND SomeValue != (SELECT AVal FROM t WHERE ID=3)
  AND SomeValue != (SELECT AVal FROM t WHERE ID=4)

让我们进一步假设 AVal 为 NULL,其中 ID = 4。因此 != 比较返回 UNKNOWN。 AND 的逻辑真值表表明 UNKNOWN 和 TRUE 是 UNKNOWN,UNKNOWN 和 FALSE 是 FALSE。没有任何值可以与 UNKNOWN 进行 AND 运算以产生结果 TRUE

因此,如果该子查询的任何行返回 NULL,则整个 NOT IN 运算符将评估为 FALSE 或 NULL,并且不会返回任何记录

查看this 帖子了解更多信息。

【讨论】:

【参考方案3】:

为什么不..

CREATE TABLE Test9 (ID int)

INSERT INTO Test9 values (1), (2), (3), (4)

SELECT * 
FROM test9 
WHERE id NOT IN (1) 
 AND EXISTS (SELECT 1 FROM test9 WHERE id = 1)

【讨论】:

以上是关于你可以在同一个查询中使用 NOT IN 和 NOT EXISTS 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别