Mysql 如果我使用OR语句而不是SQL语句,会有什么不同

Mysql 如果我使用OR语句而不是SQL语句,会有什么不同,mysql,sql,Mysql,Sql,如果我在('Subject1','Subject2')中使用,winner,会有什么不同&winner='Subject1'或winner='Subject2' 查询以下链接中的表17: 对于包含两个元素的列表,它没有什么区别 但是,当列表由常量表达式组成时,MySQL会在中优化。它基本上对它们进行排序,并在列表中进行二进制搜索。使用较长的列表可以节省大量成本。正如秘书长解释的那样: 如果所有值都是常量,则将根据类型对其求值 对expr进行分类。然后使用 二进制搜索。这意味着如果IN值列表中 完

如果我在('Subject1','Subject2')中使用,
winner,会有什么不同&
winner='Subject1'或winner='Subject2'

查询以下链接中的表17:


对于包含两个元素的列表,它没有什么区别

但是,当列表由常量表达式组成时,MySQL会在
中优化
。它基本上对它们进行排序,并在列表中进行二进制搜索。使用较长的列表可以节省大量成本。正如秘书长解释的那样:

如果所有值都是常量,则将根据类型对其求值 对expr进行分类。然后使用 二进制搜索。这意味着如果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')
这不会发生在
中的
中:

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

对于包含两个元素的列表,这没有什么区别

但是,当列表由常量表达式组成时,MySQL会在
中优化
。它基本上对它们进行排序,并在列表中进行二进制搜索。使用较长的列表可以节省大量成本。正如秘书长解释的那样:

如果所有值都是常量,则将根据类型对其求值 对expr进行分类。然后使用 二进制搜索。这意味着如果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')
这不会发生在
中的
中:

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

如果有问题的列上有索引,
in
的性能大大优于
。经验表明,当列上有
时,db始终不使用索引

如果所讨论的列上没有索引,
in
out执行
如果列表长度超过大约5(执行一些串行比较要比遍历一个小的值树快,这就是DB将列表转换为执行的内容)


中的
也是为了可读性和避免省略括号时SQL的运算符优先级陷阱而首选的,即
x=a或x=b和c=d
被解析为
x=a或(x=b和c=d)
,而不是(可能)预期的
(x=a或x=b)和c=d

<,
IN
的性能大大优于
。经验表明,当列上有
时,db始终不使用索引

如果所讨论的列上没有索引,
in
out执行
如果列表长度超过大约5(执行一些串行比较要比遍历一个小的值树快,这就是DB将列表转换为执行的内容)


中的
也是为了可读性和避免省略括号时SQL的运算符优先级陷阱而首选的,即
x=a或x=b和c=d
被解析为
x=a或(x=b和c=d)
而不是(可能)预期的
(x=a或x=b)和c=d

使用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

使用时请小心,不要:

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

这个表达式读起来不同。除此之外:无。我不熟悉MySQL,但在中您可能可以使用一个表,例如,
winner IN(从tableY WHERE somePredicate中选择columnX)
。在中使用,因为1)要键入的字符更少。2) 当还存在其他条件时,可降低发生和/或问题的风险。表达式的内容不同。除此之外:无。我不熟悉MySQL,但在中您可能可以使用一个表,例如,
winner IN(从tableY WHERE somePredicate中选择columnX)
。在中使用,因为1)要键入的字符更少。2) 在出现其他情况时,降低风险和/或问题。不要相信你的陈述,逻辑不再是你真正想要的。
非常清楚。我自己读了几遍才明白你在说什么。不要相信你的陈述,逻辑不再是你真正想要的。
非常清楚。我自己读了几遍才明白你在说什么。