1.对于IN 和 EXISTS 的性能区别: 

    (1). select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;

         T1数据量小而T2数据量非常大时,T1<<T2 时,(1)的查询效率高。

    (2). select * from T1 where T1.a in (select T2.a from T2) ;

          T1数据量非常大而T2数据量小时,T1>>T2 时, (2) 的查询效率高。

即,如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。 

 
2.NOT IN 与NOT EXISTS:
NOT EXISTS 与 NOT IN 不能完全互相替换,看具体的需求。如果选择的列可以为空,则不能被替换。