在MySql中使用IN子句的不同方法

时间:2013-04-20 06:36:30

标签: mysql sql

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

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

其他一些用户已将答案发布为此类

SELECT * FROM table_name where val1 IN (column_name)

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

来自Mysql Docs

  

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在查询中的正确使用。

2 个答案:

答案 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。