in 使用于主表(e)比子查询表(d)大的情况下,效率更好
exists使用于主表(e)比子查询表(d)小的情况下,效率更好
例:
语句(1)SELECT * FROM emp e WHERE e.deptno IN (SELECT d.deptno FROM dept d);
语句(2)SELECT * FROM emp e WHERE EXISTS(SELECT d.deptno from dept d WHERE e.deptno=d.deptno );
1/ 如语句(1),其实在in()查询子表时,做的时将子表d中所有的deptno全部遍历一遍并缓存在一张表中,检查e表的deptno是否与d表的deptno相等,如果相等就把记录加入到结果集,直到遍历完e表记录。
及这个过程如同进行了两个for循环的过程,如果前表有10000条数据而后表有1000000条数据,则最差要遍历10000*1000000次,而d表数据少时,效率还是可以的,因为主表e必须遍历去查找,所以效率和d表(子表)数据多少有关。
2/ 而exists,它只经历一次遍历操作,它只做判断e表deptno与d表数据deptno,无论如何,它的判断只执行e.length()次,所以在a表较小,或e表比的d表小时,都很实用。
而且in使用缓存,而exists则要去查询数据库,查询数据库能耗更高,占用内存更快。