in和exsist - zLulus/My_Note GitHub Wiki

官方资料:
IN (Transact-SQL)
EXISTS (Transact-SQL)

对比:

in exsist
1 区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键)
2 首先查询子查询的表,然后将内表和外表做一个笛卡尔积(内表较小,in的速度较快) 遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中
3 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in 如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists
4 先执行子查询 以外层表为驱动表,先被访问
5 in不对NULL进行处理
6 in 是把外表和内表作hash 连接 exists是对外表作loop循环,每次loop循环再对内表进行查询
7 not in:内外表都进行全表扫描,没有用到索引 not extsts 的子查询依然能用到表上的索引(无论那个表大,用not exists都比not in要快)

参考资料

Sql语句中IN和exists的区别及应用