如果我使用, winner IN ('Subject1','Subject2'); & winner='Subject1' OR winner='Subject2'; 在下面的链接中查询表17: https://www.w3resource.com/sql-exercises/sql-retrieve-from-table.php#sqleditor
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
如果列上有索引, IN 大大超过了表演 OR . 经验告诉我,db在出现错误时总是不使用索引 OR 在柱子上。 如果列上没有索引, IN 出类拔萃 OR 如果列表的长度大于5(执行一些串行比较比遍历一个小的btree值要快,这是db将列表转换为执行的内容)。 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 .
对于包含两个元素的列表,这没有什么区别。 然而,mysql优化了 IN 当列表由常量表达式组成时。它基本上对它们进行排序,并在列表中进行二进制搜索。使用较长的列表可以节省大量开支。如文件所述: 如果所有值都是常量,则根据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'
3条答案
按热度按时间h79rfbju1#
使用时小心不要:
然而
mefy6pfw2#
如果列上有索引,
IN
大大超过了表演OR
. 经验告诉我,db在出现错误时总是不使用索引OR
在柱子上。如果列上没有索引,
IN
出类拔萃OR
如果列表的长度大于5(执行一些串行比较比遍历一个小的btree值要快,这是db将列表转换为执行的内容)。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
.dnph8jn43#
对于包含两个元素的列表,这没有什么区别。
然而,mysql优化了
IN
当列表由常量表达式组成时。它基本上对它们进行排序,并在列表中进行二进制搜索。使用较长的列表可以节省大量开支。如文件所述:如果所有值都是常量,则根据expr的类型对它们进行求值并进行排序。然后使用二进制搜索完成对项目的搜索。这意味着如果in值列表完全由常量组成,那么in是非常快的。
一般来说,
IN
更安全,并且可以更好地捕获所需的列。很容易接受这样的条件:并添加另一个条件:
这种逻辑可能不再是你真正想要的——因为它真正的意思是:
这种情况不会发生在
IN
: