在和或在何处之间的SQL差异

在和或在何处之间的SQL差异,sql,Sql,以下两个命令之间有什么区别 SELECT * FROM table WHERE id IN (id1, id2, ..., idn) 及 哪一个更快?如果id是另一种类型,它会有所不同吗?我认为IN更快,这纯粹是因为您提供了一个服务器可以处理的更简单的查询。 只是我的想法 参见本文中Fernando Giovanini的以下评论,他提到in不仅使其更可读,而且速度更快:它们在语义上是相同的 IN只是一个相等语句字符串的简写,如第二个示例中所示。性能也应该相同 类型应该无关紧要,它将始终计算为一

以下两个命令之间有什么区别

SELECT * FROM table WHERE id IN (id1, id2, ..., idn)


哪一个更快?如果id是另一种类型,它会有所不同吗?

我认为IN更快,这纯粹是因为您提供了一个服务器可以处理的更简单的查询。 只是我的想法

参见本文中Fernando Giovanini的以下评论,他提到in不仅使其更可读,而且速度更快:

它们在语义上是相同的

IN只是一个相等语句字符串的简写,如第二个示例中所示。性能也应该相同

类型应该无关紧要,它将始终计算为一系列等式

使用NOT IN和可以为NULL的数据时会有所不同,但是-NULL不会对NOT IN比较计算false,因此您可能会在结果集中得到预期不到的行

例如:

选择“已通过!”其中NULL不在“foo”、“bar”中


上面的查询将不会返回行,即使在票面值NULL既不是“foo”也不是“bar”-这是因为NULL是一种未知状态,SQL无法确定未知值不是列出的值之一。

这取决于特定的DBMS优化器实现和引擎本身

但是你应该认为它们在语义上是相似的,并且以相似的方式进行优化


优化不会依赖于字段类型,至少在sqlserver中是这样的,因为两者都给出了相同的执行计划

由于数据结构的原因,每个DBMS在运算符中的预执行都足够可靠。 此外,当db计算sql计划时,它不一定会将OR表单转换为IN表单,因为OR运算符可以将不同的条件组合在一起。
从逻辑的角度来看,它们是完全相同的。

了解我们在这里讨论的SQL实现也是很好的。当您使用NOT IN时,会有不同-怎么会这样?不在===f!=1和f!=2.这两个表达式再次以相同的方式进行优化way@zerkms-至少在SQL Server中不使用NULL。选择1,其中NULL不在“foo”和“bar”中-您将不会得到一行,但您希望得到一行,因为NULL既不是foo也不是barah,我想您的意思是有两种不同的情况:使用NOT IN和在parentheses@zerkms-不,当你将NULL与NOT IN进行比较时,它不会计算为true,因为SQL不能确定NULL绝对不是这些值中的一个。他我知道,我只是说,从你的帖子上看,我不清楚你说了什么-在查询中使用secmatrix(如“%8:0%”或secmatrix(如“%8:0%”)或secmatrix(如“%4:0%”或secmatrix(如“%2:0%”)时,不可能说任何东西比任何东西都快。它看起来至少很滑稽或呆板-就我个人而言,我建议你千万不要用没有任何证据的陈述来指代不知名的人,尤其是在完全错误的情况下。我从来没有说过他说的是真的,也没有说过我说的是真的。我所做的只是给出我的想法并参考一篇文章。这就是为什么很多人都会给出答案,每个人都有自己的观点和/或经验。如果他不能从任何人那里得到答案,他会有关于这个问题的错误想法,比没有想法更糟糕。互联网上有无数可怕的提及和文章,没有理由仅仅因为没有其他人回答就引用它们。我怎么知道我的想法和来源是错误的呢?有一条伟大的规则——你对某些事情不确定——然后假设你错了。没有证据表明有提及/断言——假设它也是错误的。这很简单,不是吗我只是想说,提及一些奇怪的想法会让事情变得更糟,只要它成为开发人员的非争论性和不信任的信息来源。我认为问题是关于调优,而不是操作的。@Brian我的anwser不完整吗?在任何条件下,查询都是相等的,但在可读性方面是明显的diferent@BrianL:哪一个更快?-这是一个明确的问题,这个答案,更明确地说,部分地回答了这个问题,尽管我不喜欢它;-+1.anyway@zerkms谢谢有时候对不说英语的人来说很难
SELECT * FROM table WHERE id = id1 OR id = id2 OR ... OR id = idn