当前位置: 首页 > 面试题库 >

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

王泓
2023-03-14
问题内容

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

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(值,…)

如果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的正确用法。


问题答案:

您在这里提出了一个与我的答案有关的 问题

在下面使用此语句的简单说明中,

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

而第二条语句是 一个值比较多列

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

这彼此有点不同。

更新1

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

  • 多列IN子句-意外的MySQL问题


 类似资料:
  • 问题内容: 我有一个数据库,其中有四列对应于开始和结束位置的地理坐标x,y。这些列是: 00 00 x1 11 我有这四个列的索引,其顺序为x0,y0,x1,y1。 我列出了大约一百种地理对组合。我将如何有效地查询此数据? 我想按照此SO答案的建议执行类似的操作,但它仅适用于Oracle数据库,不适用于MySQL: 我以为可能对索引做些什么?最好的方法是什么(即:最快的查询)?谢谢你的帮助! 笔记

  • 问题内容: 我有三个表来定义用户: 我想创建一个对应用程序中的其他用户具有一定访问权限的中间层用户。为了确定已登录的用户可以访问哪些用户,我使用了如下子查询: 当前,我将子查询字符串存储在变量中,然后每次需要拉出用户列表时,将其动态插入到外部查询中。完成此操作后,我想到“最好只存储实际s 的字符串”。 因此,与其将其存储在变量中… …我实际上是执行查询并以这种方式存储结果… 然后,当我需要拉一小部

  • 问题内容: 为什么以下SQL不能给我任何东西 虽然 吸引我的行 问题答案: 您可以根据需要执行一些动态SQL,但我认为这并不是真正的竞争。

  • 问题内容: 我正在使用iBATIS创建选择语句。现在,我想用iBATIS实现以下SQL语句: 使用以下方法,语句准备不正确,并且没有结果返回: iBATIS似乎重新构建了该列表,并尝试将其解释为字符串。 如何正确使用IN子句? 问题答案: 这是一篇博客文章,回答您的问题: iBatis:使用SQL IN关键字支持数组或列表参数 在Java中,您应该传入java.util.List。例如

  • 如何使用hibernateTemplate执行批量更新操作。下面的代码抛出 原因:org。冬眠QueryParameterException:位置超出已声明序数参数的数量。请记住,序数参数是基于1的!职位:2 如何通过将用户列表作为参数传递来实现此批量更新操作???

  • 问题内容: 我正在编写一些SQL,并使用AdoDb连接到我的数据库并运行查询等等。我正在使用参数化查询,并且遇到了麻烦。 它们是将值的数组传递给AdoDb / MySql中的in_clause进行参数化的一种方法。 我的问题是,如果我将准备好的字符串作为参数传递,即 ‘test’,’test2’,’test3’, 则它不起作用,因为库或数据库会自动对其进行转义并在开头和结尾处添加外部引号,因此所有