=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 运算符的。
参考链接:
- http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_in
- http://www.bkjia.com/Mysql/1084095.html
- http://dev.mysql.com/doc/refman/5.7/en/any-in-some-subqueries.html
- http://dev.mysql.com/doc/refman/5.7/en/logical-operators.html#operator_or
- MySQL中大于小于,IN,OR,BETWEEN性能比较
=END=
《“MySQL的in运算符”》 有 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