WHERE中IN和OR之间的SQL差异

时间:2012-01-26 20:08:49

标签: sql

以下两个命令有什么区别?

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

SELECT * FROM table WHERE id = id1 OR id = id2 OR ... OR id = idn

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

5 个答案:

答案 0 :(得分:12)

它们在语义上相同。

IN只是第二个示例中的一系列相等语句的简写。表现也应该相同。

类型无关紧要,它总是会评估为一系列等式。

使用NOT IN和数据NULL时会有所不同,但NULLNOT IN比较不会评估为false,所以你可能会得到你在结果集中没有想到的行。

举个例子:

SELECT 'Passed!' WHERE NULL NOT IN ('foo', 'bar')

即使面值NULL不是'foo''bar',上述查询也不会返回一行 - 这是因为NULL是一个未知状态,而SQL不能肯定地说未知值是 IN列出的值之一。

答案 1 :(得分:1)

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

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

优化不依赖于字段类型

答案 2 :(得分:1)

至少在sqlserver中都给出了相同的执行计划!!!

答案 3 :(得分:0)

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

答案 4 :(得分:-3)

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

请参阅Fernando Giovanini在本文中的以下评论,他提到IN使其不仅更具可读性而且更快:http://www.ajaxline.com/32-tips-to-speed-up-your-mysql-queries#comment-325677194