如果我在SQL中使用OR语句而不是IN会产生什么区别

时间:2018-06-30 18:11:51

标签: mysql sql

如果我使用Imports Word = Microsoft.Office.Interop.Word Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim oWord As Word.Application Dim oDoc As Word.Document 'Start Word and open the document template. oWord = CreateObject("Word.Application") oWord.Visible = True oDoc = oWord.Documents.Add("C:\MyTemplate.dotx") oDoc.Bookmarks.Item("CustomerName").Range.Style = "John Smith" oDoc.Bookmarks.Item("CustomerPhone").Range.Style = "(123) 456-7890" oDoc.Bookmarks.Item("CustomerEmail").Range.Style = "Jsmith@mail.com" Me.Close() End Sub End Class winner IN ('Subject1','Subject2');

有什么区别?

以下链接中表17的查询:

https://www.w3resource.com/sql-exercises/sql-retrieve-from-table.php#SQLEDITOR

3 个答案:

答案 0 :(得分:2)

对于具有两个元素的列表,这没有什么不同。

但是,当列表由常量表达式组成时,MySQL会优化IN。它基本上对它们进行排序,并对列表进行二进制搜索。使用更长的列表可以节省大量资金。正如documentation所解释的:

  

如果所有值都是常量,则根据类型对它们进行求值   的expr和排序。然后使用   二进制搜索。这意味着如果IN值列表,则IN非常快   完全由常量组成。

通常,IN更安全,并且可以更好地捕获所需的列。采取这样的条件非常容易:

where winner = 'Subject1' OR winner = 'Subject2'

并添加另一个条件:

where winner = 'Subject1' or winner = 'Subject2' and
      foo = 'bar'

并且这种逻辑可能不再是您真正想要的-因为它确实意味着:

where winner = 'Subject1' or
      (winner = 'Subject2' and foo = 'bar')

IN不会发生这种情况:

where winner in ('Subject1', 'Subject2') and
      foo = 'bar'

答案 1 :(得分:1)

如果所讨论的列上有索引,则IN的表现将大大优于OR。经验表明,当列上有OR时,数据库始终不使用索引。

如果所讨论的列上没有索引 ,则如果列表长于大约5,则IN的表现优于OR(进行一些串行比较会更快)而不是遍历一个小的BTree值,这就是数据库将列表转换成要执行的内容。

IN也是可读性最好的,并且如果省略了括号,也可以避免SQL的运算符优先级陷阱,即x = a or x = b and c = d被解析为x = a or (x = b and c = d)而不是(可能)预期的(x = a or x = b) and c = d

答案 2 :(得分:0)

使用NOT时要小心:

select col1 from
(
select 1 as col1
union all
select 2 as col1
union all
select 3 as col1
union all
select 4 as col1
)x
where x.col1 NOT IN (2,3,4) ;
----------
col1
1

但是

select col1 from
(
select 1 as col1
union all
select 2 as col1
union all
select 3 as col1
union all
select 4 as col1
)x
where x.col1 != 2 OR x.col1 != 3 OR x.col1 != 4 ;

---
col1
1
2
3
4