mysql里的in是一种条件筛选操作符,用于判断指定字段的值是否存在于给定的值集合中,是sql查询中非常常用的语法元素,能大幅简化多值匹配的查询逻辑。

in操作符的基本语法
in操作符的基本使用格式如下,通常搭配WHERE子句使用:
-- 基础语法格式 SELECT 字段列表 FROM 表名 WHERE 字段名 IN (值1, 值2, 值3...);
上述语法的含义是:查询表中指定字段的值等于值1、值2、值3中任意一个的记录,只要满足其中一个匹配条件就会被筛选出来。
in操作符的常见使用场景
1. 替代多个or条件
在没有in操作符时,如果要查询某个字段匹配多个值的情况,需要写多个or条件,比如查询用户表中id为1、3、5的用户:
-- 使用or的写法 SELECT * FROM user WHERE id = 1 OR id = 3 OR id = 5; -- 使用in的等价写法 SELECT * FROM user WHERE id IN (1, 3, 5);
可以看到使用in的写法更加简洁,尤其是当需要匹配的值数量较多时,优势会更加明显。
2. 搭配子查询使用
in操作符后面不仅可以跟固定的值集合,还可以跟一个子查询,子查询会返回一个值集合,然后判断外层查询的字段是否存在于这个集合中。比如查询所有下过订单的用户信息:
-- 子查询返回所有下过订单的用户id集合 SELECT * FROM user WHERE id IN (SELECT user_id FROM order);
3. 不同数据类型的支持
in操作符支持多种数据类型的值匹配,包括数值类型、字符串类型、日期类型等。如果是字符串类型的值,需要用单引号包裹:
-- 字符串类型值匹配
SELECT * FROM user WHERE username IN ('张三', '李四', '王五');
-- 日期类型值匹配
SELECT * FROM order WHERE create_time IN ('2024-01-01', '2024-01-02');
in操作符的使用注意事项
- 如果in后面的值集合为空,那么整个条件判断会返回false,不会匹配到任何记录。
- 当in后面的值集合数量非常多时,可能会影响查询性能,此时可以考虑优化查询逻辑,比如将值集合存入临时表再进行关联查询。
- in操作符和
NOT IN是相反的逻辑,NOT IN用于判断字段的值不在给定的集合中,使用方式类似:SELECT * FROM user WHERE id NOT IN (1,3,5); - 如果子查询返回的结果中包含null值,使用
NOT IN时可能会出现不符合预期的结果,因为null值和任何值的比较都返回null,此时建议先过滤掉子查询中的null值。
in和exists的简要对比
在很多子查询场景中,in和exists可以实现相同的查询效果,但两者的执行逻辑不同。in是先执行子查询,再将子查询的结果和外层查询匹配;exists是先执行外层查询,再判断外层查询的每条记录是否满足子查询的条件。一般来说,当子查询结果集较小时,in的性能更好;当子查询结果集较大时,exists的性能更优。
下面是一个两者实现相同功能的示例:
-- 使用in查询下过订单的用户 SELECT * FROM user u WHERE u.id IN (SELECT o.user_id FROM order o); -- 使用exists查询下过订单的用户 SELECT * FROM user u WHERE EXISTS (SELECT 1 FROM order o WHERE o.user_id = u.id);