今天我发布了一个像这样的查询的答案
SELECT * FROM table_name where column_name IN (val1,val2,...)
其他一些用户已将答案发布为此类
SELECT * FROM table_name where val1 IN (column_name)
正如您在此处所看到的,column_name的位置和值是互换的。
expr IN(value,...)
如果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 Documentation 中列出其他方法?
此问题可作为有关IN使用的规范信息来源。其目的是提供详细,高质量的答案,详细说明IN在查询中的正确使用。
答案 0 :(得分:29)
您提出了一个与我的回答here相关的问题。
使用以下陈述的简单解释
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
,而第二个语句 A VALUE 与多列进行比较。
SELECT *
FROM TableName
WHERE column1 = 1 OR
column2 = 1 OR
column3 = 1 OR
column4 = 1
彼此有点不同。
更新1
这是IN
子句的第三种形式:
答案 1 :(得分:4)
如问题中所述,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
的值进行比较(紧接在{{1}之前}} operator)。总结一下:IN
必须求值为单个值(对于给定行),而要匹配的带括号的值集可以计算为0,1个或更多值。
在这方面,MySQL的运行方式与我使用过的任何其他SQL版本相同。
MySQL 的不同之处在于整个expr
子句本身的计算结果为0或1,MySQL分别视为false或true - 在SQL的大多数变体中,整个子句都会求值为布尔值FALSE或TRUE。