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 而异。
以下帖子包含一些有趣的观察结果:
- IN vs OR in the SQL WHERE Clause(MySQL 等)
- SQL IN() versus OR(SQL 服务器)
SQL 服务器似乎为 x IN (...)
和 x = ... OR x = ...
生成相同的执行计划,而 MySQL 对它们的处理方式不同。
编写 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 而异。
以下帖子包含一些有趣的观察结果:
- IN vs OR in the SQL WHERE Clause(MySQL 等)
- SQL IN() versus OR(SQL 服务器)
SQL 服务器似乎为 x IN (...)
和 x = ... OR x = ...
生成相同的执行计划,而 MySQL 对它们的处理方式不同。