相同点

in和exists都是用于范围查找

1
2
3
SELECT * from t_user AS 外表 WHERE  EXISTS (select b.user_id FROM t_user_org 内表 WHERE a.user_id =b.user_id);

SELECT * from t_user AS 外表 WHERE a.user_id in (select b.user_id FROM t_user_org 内表 );

不同点

  1. in是把外表和内表做hash链接,先查询内表(b表)返回数据列,在将返回的数据列给外表(a表)做比较,无论子表是否有数据都对子查询进行全部匹配
  2. exists是对外表做loop循环,循环后在对内表进行查询,将外表查询的接口放到exists中做条件验证,根据验证结果true和false来过滤数据,如果有一个存在则返回外表所有数据

外表查询结果集大的用in,内表查询结果集大的用exstis