如果我使用or语句而不是sql语句会有什么不同

ar7v8xwq  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(380)

如果我使用, winner IN ('Subject1','Subject2'); & winner='Subject1' OR winner='Subject2'; 在下面的链接中查询表17:
https://www.w3resource.com/sql-exercises/sql-retrieve-from-table.php#sqleditor

h79rfbju

h79rfbju1#

使用时小心不要:

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
mefy6pfw

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 .

dnph8jn4

dnph8jn43#

对于包含两个元素的列表,这没有什么区别。
然而,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'

相关问题