mysql中的in是条件筛选类的关键字,核心作用是判断指定字段的取值是否包含在后续给定的数值集合中,属于逻辑判断的一种简化形式,能替代多个or连接的条件判断,让查询语句更简洁易读。

in的基本语法结构
in关键字的基本使用语法如下,通常搭配WHERE子句使用:
-- 基本语法 SELECT 字段列表 FROM 表名 WHERE 字段名 IN (值1, 值2, 值3, ...); -- 示例:查询id为1、3、5的用户信息 SELECT * FROM user WHERE id IN (1, 3, 5);
上述语句的含义是:从user表中查询出id字段取值等于1、3或者5的所有记录,和下面的or写法效果完全一致:
SELECT * FROM user WHERE id = 1 OR id = 3 OR id = 5;
in的常见使用场景
1. 筛选离散的固定值
当需要查询字段取值为多个不连续固定值的时候,使用in比多个or拼接更简洁,比如查询指定分类的商品:
-- 查询分类为手机、电脑、平板的商品
SELECT * FROM product WHERE category IN ('手机', '电脑', '平板');
2. 搭配子查询使用
in后面也可以跟一个子查询,子查询返回的结果集作为判断的集合,比如查询有订单的用户信息:
-- 先查询所有下过订单的用户id,再查询这些用户的信息 SELECT * FROM user WHERE id IN (SELECT user_id FROM order_info);
in和or、exists的差异
| 对比项 | in | or | exists |
|---|---|---|---|
| 适用场景 | 字段取值匹配固定集合或子查询结果 | 少量离散条件判断 | 子查询结果集较大时关联查询 |
| 可读性 | 条件多的时候更简洁 | 条件多的时候语句冗长 | 逻辑更偏向存在性判断 |
| 性能表现 | 小结果集子查询时效率较好 | 条件少的时候和in差异不大 | 大结果集子查询时通常优于in |
in使用的注意事项
- in后面的集合元素类型需要和字段类型匹配,比如字段是整型,集合里就不能放字符串,否则会触发隐式转换影响性能。
- in后面的集合元素数量不建议过多,通常不要超过1000个,否则可能导致查询性能下降,甚至触发mysql的长度限制。
- 如果子查询返回的结果集非常大,建议优先考虑使用exists替代in,避免内存占用过高。
- in可以和not搭配使用,
NOT IN表示字段取值不在给定集合中,使用的时候要注意集合中不能有NULL值,否则会导致判断结果不符合预期。
NOT IN的使用示例
查询没有下过订单的用户信息,需要注意子查询结果不能包含NULL:
-- 正确写法:确保子查询不会返回NULL SELECT * FROM user WHERE id NOT IN (SELECT user_id FROM order_info WHERE user_id IS NOT NULL);
注意:如果子查询返回的结果中存在NULL值,NOT IN的判断会直接返回空结果,因为NULL和任何值的比较结果都是未知,无法判定是否不在集合中。