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 【问题描述】:我在问自己应该使用<> 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)
这两个查询返回完全相同的结果。
现在我想知道<> ALL
和NOT IN
之间的主要区别是什么。有人有想法吗?
【问题讨论】:
如果您希望其他人了解您的查询,请使用NOT IN
我假设第二次短路,但编译器可能会识别出等价性。您实际上可以在 SSMS 中运行这两个查询并查看实际的查询计划。你不知道该怎么做吗?
@TimSchmelter 我知道<> 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
(同样是ANY
和SOME
)关键字很少使用,其他开发人员会觉得很陌生。
有关这些关键字的进一步说明,请参阅 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 之间的主要区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章