-- 用 IN SELECT * FROM user WHERE id IN (SELECT user_id FROM orders); -- 用 EXISTS SELECT * FROM user u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
两者都能实现“筛选存在关系”,那到底有什么区别? 是不是 EXISTS 性能更好? IN 一定比较慢吗?
一、IN 和 EXISTS 的本质区别
要理解区别,必须记住一句话:
IN 是把子查询结果返回给外层,外层再匹配; EXISTS 是拿外层每一行去子查询中试探。
换句话说:
方式
工作原理
IN
将子查询结果全部取出 → 临时表 → 外层匹配
EXISTS
外层循环每一行 → 子查询判断是否存在(true/false)
理解这个差异,对后面的性能分析非常重要。
二、IN 适合“子查询结果小”的场景
例如:
SELECT * FROM order WHERE product_id IN (SELECT id FROM product WHERE type='book');