MySQL的in运算符


=Start=

缘由:

工作需要,学习需要

正文:

参考解答:

MySQL IN 运算符用于 WHERE 表达式中,以列表项的形式支持多个选择。

MySQL IN 运算符的语法
WHERE column IN (value1,value2,...)
WHERE column NOT IN (value1,value2,...)

当 IN 前面加上 NOT 运算符时,表示与 IN 相反的意思,即不在这些列表项内选择。

MySQL IN 使用实例

选取 uid 为 2、3、5 的用户数据:

SELECT * FROM user WHERE uid IN (2,3,5)
MySQL IN 子查询

更多情况下,IN 列表项的值是不明确的,而可能是通过一个子查询得到的:

SELECT * FROM article WHERE uid IN (SELECT uid FROM user WHERE status=0)

在这个 SQL 例子里,我们实现了查出所有状态为 0 的用户(可能是被禁止)的所有文章。首先通过一个查询得到所有所有 status=0 的用户:

SELECT uid FROM user WHERE status=0

然后将查询结果作为 IN 的列表项以实现最终的查询结果,注意在子查询中返回的结果必须是一个字段列表项。

MySQL IN 运算符的效率问题

如果 IN 的列表项是确定的,那么可以用多个 OR 来代替

SELECT * FROM user WHERE uid IN (2,3,5)
// 等效为:
SELECT * FROM user WHERE (uid=2 OR uid=3 OR uid=5)

一般认为,如果是对索引字段进行操作,使用 OR 效率高于 IN,但对于列表项不确定的时候(如需要子查询得到结果),就必须使用 IN 运算符。另外,对于子查询表数据小于主查询的时候,也是适用 IN 运算符的。

参考链接:

=END=

, ,

《“MySQL的in运算符”》 有 1 条评论

  1. 不常见的多列 IN 查询语句,及数据库支持情况。
    https://www.coderbusy.com/archives/2242.html
    `
    SQL 中最强大的也是最复杂的就是查询部分。在需要查询多条记录时我们一般会采用 in 关键字来指定要查询的条件:
    > SELECT * FROM t_user WHERE uid IN (1,2,3,4,5,6,7,8,9);

    但如果对应的数据需要两个或更多字段才能确定,可能会写出以下的 SQL 语句:
    > SELECT * FROM t_user WHERE
    (first_name = ‘first_name_1’ AND last_name = ‘last_name_1’) OR
    (first_name = ‘first_name_6’ AND last_name = ‘last_name_6’) OR
    (first_name = ‘first_name_7’ AND last_name = ‘last_name_7’);

    以上代码当然能用,但拼接出来的语句过于复杂。有一个方法可以改善这个问题,就是使用多列 IN 的语法。

    MySQL 是支持多列 IN 查询的,以上的 SQL 可以改写为:
    > SELECT * FROM t_user WHERE (first_name,last_name) IN (
    (‘first_name_1′,’last_name_1’),
    (‘first_name_6′,’last_name_6’),
    (‘first_name_7′,’last_name_7’)
    );

    需要注意的是,该写法在 MySQL 5.7 及以后的版本才被支持。
    `

    MySQL multiple columns in IN clause
    https://stackoverflow.com/questions/44706196/mysql-multiple-columns-in-in-clause
    https://dev.mysql.com/doc/refman/5.7/en/row-constructor-optimization.html

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注