SQL 解析器是否只是将 IN 解释为一系列 OR 条件?

Do SQL parsers just interpret IN as a series of OR conditions?

编写 SQL 查询时,例如

SELECT ID, NAME FROM USER_TABLE WHERE ID IN (1, 2, 10, 14, 15, ..., n)

解析器只是将其改写成这个吗?

SELECT ID, NAME FROM USER_TABLE WHERE ID = 1 
                                      OR ID =  2 
                                      OR ID =  10
                                      OR ID =  14
                                      OR ID =  15 
                                      ...
                                      OR ID =  n

或者为了提高效率,它会在后台做其他事情吗?虽然手写是一场噩梦而且我永远不会提倡这样做,但使用 IN 而不是一系列类似的 OR 条件是否有任何理论上的性能优势或影响?

这取决于数据库。从逻辑上讲,IN 被解释为 OR 的序列,但这并不意味着这是底层实现。

例如,MySQL 将对常量列表进行排序并使用二进制搜索来查找匹配项。这与一系列 OR 完全不同。

根据规范 (SQL92 for example),x IN (a, b, c) 描述为:

8.4  <in predicate>

[...]

4) The expression
     RVC IN IPV
   is equivalent to
     RVC = ANY IPV

并且:

8.7  <quantified comparison predicate>

[...]

<quantified comparison predicate> ::=
     <row value constructor> <comp op> <quantifier> <table subquery>

<quantifier> ::= <all> | <some>

<all> ::= ALL

<some> ::= SOME | ANY

[...]

   c) If the implied <comparison predicate> is true for at least
     one row RT in T, then "R <comp op> <some> T" is true.

最后一行似乎暗示 x IN (a, b, c) 应该提供与 x = a OR x = b OR x = c 相同的结果。然而,规范并未规定 RDBM 应如何实现行为,它可能因 RDBM 而异。

以下帖子包含一些有趣的观察结果:

SQL 服务器似乎为 x IN (...)x = ... OR x = ... 生成相同的执行计划,而 MySQL 对它们的处理方式不同。