19

今天我发布了一个这样的查询的答案

SELECT * FROM table_name where column_name IN (val1,val2,...)

另一个用户发布了这样一个查询的答案

SELECT * FROM table_name where val1 IN (column_name)

正如您在此处看到的, column_name 的位置和值是互换的。

来自 Mysql 文档

expr IN(值,...)

如果 expr 等于 IN 列表中的任何值,则返回 1,否则返回 0。如果所有值都是常量,则根据 expr 的类型对它们进行评估并排序。然后使用二进制搜索完成对项目的搜索。这意味着如果 IN 值列表完全由常量组成,则 IN 非常快。

mysql> SELECT 2 IN (0,3,5,7);
-> 0

mysql> SELECT 'wefwf' IN ('wee','wefwf','weg');
-> 1

正如它清楚地表明上述(我的查询)是正确的。但上述两个查询都产生相同的输出。

另外,为什么不在Mysql 文档中列出的其他方法?

此问题可作为有关使用 IN 的规范信息源。其目的是提供详细、高质量的答案,详细说明在查询中正确使用 IN。

4

2 回答 2

32

你提出了一个与我的回答相关的问题

在下面使用此语句的简单解释中,

SELECT * FROM TableName WHERE column1 IN (1, 2, 3, 4)
-- versus
SELECT * FROM TableName WHERE 1 IN (column1, column2, column3, column4)

第一条语句仅涉及与多个值进行比较的一列

SELECT  *
FROM   TableName
WHERE  column1 = 1 OR
       column1 = 2 OR
       column1 = 3 OR
       column1 = 4

而第二条语句是与多个列进行比较的 VALUE

SELECT  *
FROM   TableName
WHERE  column1 = 1 OR
       column2 = 1 OR
       column3 = 1 OR
       column4 = 1

这有点不同。


更新 1

IN这是从句的第三种形式:

于 2013-04-20T06:43:15.580 回答
5

如问题中所述,MySQL文档将 IN 子句的形式提供为:

expr IN (value,...)

expr是一个表达式,对于给定的行只能有一个值 - 这个值可以是一个常量(例如 2),一个列的名称(例如column_name来自问题),它将在给定的行上具有特定的值,或任何表达式,包括为给定行生成单个值的函数、运算符、常量和 column_names。

括号的内容 - value,...- 包含一个表达式,该表达式可以被评估为提供一个值列表(可能包括一个空值列表,在这种情况下,in条件将被评估为假)。此值列表可能是:

  • 以一系列明确的一个或多个常量(例如val1,val2,...)和/或给定行的一个或多个单值列名称(例如column_name)和/或一系列表达式的形式,每个表达式为给定行;或者
  • select子句的形式返回一组值(例如select column_name from table where ...),然后可以将其与expr(紧接在IN运算符之前的)的值进行比较。

总结一下:expr必须评估为单个值(对于给定的行),而要匹配的括号中的值集可以评估为 0、1 或更多值。

在这方面,MySQL 的运行方式与我使用的任何其他 SQL 变体相同。

MySQL的不同之处在于整个子句本身expr IN (value,...)评估为 0 或 1,MySQL 分别将其视为 false 或 true - 在大多数 SQL 变体中,整个子句将评估为布尔值 FALSE 或 TRUE。

于 2013-04-20T07:10:04.903 回答