适用范围:
- in适用于子查询得出结果集少,主查询表大又有索引的情况
- exists适用于子查询表大又有索引的情况
- 在数据量小的情况下,in与exists执行效率几乎无区别
功能区别:
- in是做等值匹配,子查询返回必须与外部查询条件一致。例如外部查询判断是id,子查询返回必须为id; 示例:select * from table1 where id in (select id from table2);
- exists是通过子查询结果做判断,只要子查询有结果返回则成立。返回什么数值无所谓返回null值也可以;示例:select * from table1 t1 where 1=1 and exists (select 1 from table2 t2 where t1.id = t2.id);
- in不会对NULL值做处理,如果子查询返回结果中有NULL值会对结果有影响。如果查询结果中可能有NULL值则不要用in
原理区别:
- in是先查询子查询的表,将子表和主表做一个笛卡尔积然后按条件进行筛选
- exists是以主表为驱动,主表先被访问。