NOT IN 与 <> ALL 之间的主要区别是啥?

Posted

技术标签:

【中文标题】NOT IN 与 <> ALL 之间的主要区别是啥?【英文标题】:What are the main differences between NOT IN vs. <> ALL?NOT IN 与 <> ALL 之间的主要区别是什么? 【发布时间】:2016-04-14 13:01:39 【问题描述】:

我在问自己应该使用&lt;&gt; ALL 还是NOT IN。看看这两个示例查询:

SELECT PersonId FROM tabPerson
WHERE PersonId <> ALL(SELECT ParentId FROM tabPerson)

SELECT PersonId FROM tabPerson
WHERE PersonId NOT IN(SELECT ParentId FROM tabPerson)

这两个查询返回完全相同的结果。

现在我想知道&lt;&gt; ALLNOT IN 之间的主要区别是什么。有人有想法吗?

【问题讨论】:

如果您希望其他人了解您的查询,请使用NOT IN 我假设第二次短路,但编译器可能会识别出等价性。您实际上可以在 SSMS 中运行这两个查询并查看实际的查询计划。你不知道该怎么做吗? @TimSchmelter 我知道&lt;&gt; ALL 的可读性不如NOT IN,我讨厌不可读的代码,但是我想知道它们之间的性能或执行是否有任何差异。 哈,刚刚运行,查询计划100%完全一样。所以真的没有区别,只是在可读性上。更好的可读性始终是最好的选择。 我从 sql server 6.5 开始就一直在使用 sql server,直到今天才听说过 ALL。 BOL 中的示例非常人为,以至于在现实世界中没有人会编写这样的查询。 msdn.microsoft.com/en-us/library/ms178543.aspx 【参考方案1】:

两个查询将产生完全相同的结果。即使子查询中查询的列包含NULL值,也不会有任何区别。

我在这里比较了我的数据库中表上此类查询的几个执行计划,在每种情况下它们也完全相同。

因此,唯一的区别是其他开发人员对代码的可读性/熟悉程度。 NOT IN 表达式在这里有一个明显的优势。 ALL(同样是ANYSOME)关键字很少使用,其他开发人员会觉得很陌生。

有关这些关键字的进一步说明,请参阅 MS Technet 文章 Comparison Operators Modified by ANY, SOME, or ALL。 – 顺便说一句:本文的结论是您问题中的两个陈述是等效的。

【讨论】:

【参考方案2】:

这句话类似:

DECLARE @t1 TABLE (a INT)
INSERT INTO @t1 VALUES (1), (2)

DECLARE @t2 TABLE (b INT)
INSERT INTO @t2 VALUES (2)

SELECT * FROM @t1
WHERE a <> ALL(SELECT b FROM @t2)

SELECT * FROM @t1
WHERE a NOT IN (SELECT b FROM @t2)

即使我们谈论 NULL 值的问题:

INSERT INTO @t2(b) VALUES (NULL)

SELECT * FROM @t1
WHERE a <> ALL(SELECT b FROM @t2)

SELECT * FROM @t1
WHERE a NOT IN (SELECT b FROM @t2)

【讨论】:

是的,我知道它们返回相同的结果。但我想知道性能或执行是否存在差异。

以上是关于NOT IN 与 <> ALL 之间的主要区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

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

Python词典设置默认值小技巧

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

Django settings.py 的media路径设置

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