外观
MySQL 中 in 和 exists 区别
在 MySQL
里,IN
和 EXISTS
都用于子查询,不过它们在语法、使用场景、性能表现、和返回结果判定上来区分。
语法
IN
:用于判断某个值是否在一个子查询返回的结果集里。:
SELECT xxx
FROM xxx
WHERE xxx IN (subquery);
EXISTS
:用于检查子查询是否会返回至少一行数据。
SELECT xxx
FROM xxx
WHERE EXISTS (subquery);
使用场景
IN
:适用于子查询结果集较小的情况,主要用于判断一个值是否在某个集合中。
EXISTS
:常用于关联查询,判断主查询的记录是否在子查询中有匹配的记录。
性能表现
IN
:子查询先执行,得到结果集后,主查询会在这个结果集中进行匹配。如果子查询返回的结果集很大,会占用较多内存,且主查询的匹配效率会降低。
EXISTS
:采用的是相关子查询,主查询先执行,每处理一条记录就执行一次子查询。当子查询依赖于主查询的列时,EXISTS
的效率通常更高。
返回结果
IN
:依据子查询返回的具体值进行判断,只有当主查询列的值与子查询结果集中的某个值相等时,才会返回该行。
EXISTS
:只关注子查询是否返回行,只要子查询返回至少一行数据,EXISTS
就返回 TRUE
,主查询会返回该行。
具体例子:
-- 使用 IN 查询有订单的客户信息
SELECT *
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders);
-- 使用 EXISTS 查询有订单的客户信息
SELECT *
FROM customers
WHERE EXISTS (SELECT 1 FROM orders WHERE orders.customer_id = customers.customer_id);