Exists:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。
区别:
IN表是外边和内表进行hash连接,是先执行子查询。
EXISTS是对外表进行循环,然后在内表进行查询。
适用范围:
当查询字段进行了索引时,主表 A 大于从表 B,使用 IN 子查询效率更高,相反主表 A 小于从表 B 时,使用 EXISTS 子查询效率更高
IN有一个缺陷是不能判断NULL,因此如果字段存在NULL值,则会出现返回,因为最好使用NOT EXISTS。
下面是SQL Server的执行计划: