IN和NOT IN用于匹配或排除字段值在列表中的记录,等价于多个OR条件组合;IN可结合子查询使用,而NOT IN需注意子查询结果含NULL时会导致无返回结果,应通过IS NOT NULL过滤NULL值以避免此问题。
在 SQL 查询中,IN 和 NOT IN 用于判断某个字段的值是否在指定的值列表中,是简化多个 OR 条件的有效方式。
使用 IN 操作符
IN 可以让你在一个查询中匹配多个可能的值,等价于多个 OR 条件的组合。
例如,查找城市为北京、上海或广州的用户:
SELECT * FROM users WHERE city IN ('北京', '上海', '广州');
这条语句和下面的写法效果相同:
SELECT * FROM users WHERE city = '北京' OR city = '上海' OR city = '广州';
IN 还支持子查询,比如找出所有订单金额大于 1000 的用户的资料:
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000);
使用 NOT IN 操作符
NOT IN 是 IN 的反向操作,用于排除指定列表中的值。
例如,查找城市不是深圳或杭州的用户:
SELECT * FROM users WHERE city NOT IN ('深圳', '杭州');
如果想排除某些子查询结果对应的记录,也可以结合子查询使用:
SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM orders WHERE status = '已取消');
使用注意事项
使用 NOT IN 时要特别注意 NULL 值 的影响。如果子查询返回的结果中包含 NULL,整个 NOT IN 条件会返回 UNKNOWN,导致没有结果返回。
例如:
SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM orders);
如果
orders
表中存在
user_id
为 NULL 的记录,那么这个查询将不会返回任何行,因为任何值与 NULL 比较都会导致结果不确定。
解决方法是显式排除 NULL 值:
SELECT * FROM users WHERE id NOT IN (SELECT user_id FROM orders WHERE user_id IS NOT NULL);
基本上就这些。IN 和 NOT IN 能让条件查询更简洁,但用 NOT IN 时务必检查子查询是否可能返回 NULL,避免意外无结果的情况。