Mysql 如果我使用OR语句而不是SQL语句,会有什么不同
如果我在('Subject1','Subject2')中使用,Mysql 如果我使用OR语句而不是SQL语句,会有什么不同,mysql,sql,Mysql,Sql,如果我在('Subject1','Subject2')中使用,winner,会有什么不同&winner='Subject1'或winner='Subject2' 查询以下链接中的表17: 对于包含两个元素的列表,它没有什么区别 但是,当列表由常量表达式组成时,MySQL会在中优化。它基本上对它们进行排序,并在列表中进行二进制搜索。使用较长的列表可以节省大量成本。正如秘书长解释的那样: 如果所有值都是常量,则将根据类型对其求值 对expr进行分类。然后使用 二进制搜索。这意味着如果IN值列表中 完
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) 在出现其他情况时,降低风险和/或问题。不要相信你的陈述,逻辑不再是你真正想要的。
非常清楚。我自己读了几遍才明白你在说什么。不要相信你的陈述,逻辑不再是你真正想要的。
非常清楚。我自己读了几遍才明白你在说什么。