IN, NOT IN, EXISTS, NOT EXISTS的比较 EXISTS只是检查行的存在性。 IN检查值的存在性。 EXISTS的效率要比IN高,因此要尽可以地使用EXITS而不是IN。 当返回的结果集中包含NULL值时,NOT IN 返回FALSE, 而NOT EXISTS返回TRUE。技巧5:用NOT EXISTS替代NOT IN 当NOT IN后面跟子查询,并且查询的结果集较多时,不宜用NOT IN;但如果NOT IN后面的括号内是列表,或子查询所满足的结果集很少时,也是可以用的。原因:在子查询中,NOT IN子句将执行一个内部的排序和合并,无论哪种情况下,NOT IN都是最低率的,因为它对子查询中的表执行了一个全表遍历。可以改写为外接连或使用NOT EXISTS。技巧6:关于IN和EXISTS,IN是把内表和外表做HASH连接,则EXISTS是对外表做LOOP循环,每次LOOP循环再对内表进行查询。 如果内表和外表大小相当,则使用IN和EXISTS效率差不多少。 如果子查询的表大,则使用EXISTS,如果子查询表小,则使用IN效率高。
EXISTS只是检查行的存在性。
IN检查值的存在性。
EXISTS的效率要比IN高,因此要尽可以地使用EXITS而不是IN。
当返回的结果集中包含NULL值时,NOT IN 返回FALSE, 而NOT EXISTS返回TRUE。技巧5:用NOT EXISTS替代NOT IN
当NOT IN后面跟子查询,并且查询的结果集较多时,不宜用NOT IN;但如果NOT IN后面的括号内是列表,或子查询所满足的结果集很少时,也是可以用的。原因:在子查询中,NOT IN子句将执行一个内部的排序和合并,无论哪种情况下,NOT IN都是最低率的,因为它对子查询中的表执行了一个全表遍历。可以改写为外接连或使用NOT EXISTS。技巧6:关于IN和EXISTS,IN是把内表和外表做HASH连接,则EXISTS是对外表做LOOP循环,每次LOOP循环再对内表进行查询。
如果内表和外表大小相当,则使用IN和EXISTS效率差不多少。
如果子查询的表大,则使用EXISTS,如果子查询表小,则使用IN效率高。