in和exists的差异(挺大):

1、从语义上来说:in是去匹配in后的结果集;exists是条件上的二次匹配,匹配和结果集内相同的数据。

2、实现的效果差异不大,内部的实现差异挺大。in是有数量上限的,exists没有。

in,是由in后面的数据先运行==>得出结果集后再去匹配;

exists,则相反,是先运行外面的结果,再去和exists内的数据做匹配;

执行顺序和效率:

1、in先执行子查询,将子查询的结果存放在缓存中,在执行外层的查询,适合用在子查询结果集较小的情况。

2、exists先执行外查询,将外查询的每一条结果放到内查询中比对,如果存在,就保留外查询的结果,否则删除,适合用在外表结果集小于内表的情况。

总结:in内部的数据要少一些,exists要外部数据少一些,更能提升效率。

注意:

exists用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值true或false。

select * from health_sys_user WHERE user_id in (SELECT user_id FROM health_sys_user WHERE user_id = 1 OR user_id = 26); select * from health_sys_user WHERE exists (SELECT * FROM health_sys_role where role_id=26);

mysql复杂统计查询(SQL查询优化MySQLin和exists的区别总结)(1)

mysql复杂统计查询(SQL查询优化MySQLin和exists的区别总结)(2)

,