下述仅为简略性的概况,子查询中为何exists的效率比in的高,建议读者多查阅其他资料了解。
数据库中,我们都有一个通识,就是关于子查询中,关键字 exists 的效率是要比关键字 in 的效率高。但,为什么?
子查询 in :select * from a where in(select 1 from b where _______)
子查询 exists:select * from a where exists(select 1 from b where _______)
1、在上述in的查询中,第一步,先通过select子查询查出一张表数据,再通过外查询查询出另外一张表数据,即共查询两回,然后通过匹配,返回符合的结果集。
2、而,在exists的查询中,第一步,先通过外查询查出一张表的数据,exists关键字返回的是true或者false的布尔值,即只对外查询查出的表的数据进行布尔判断,不再另外查询。
综上,exists的的效率会比in的效率高。其实,在Oracle数据库中,in的范围是1000条,即子查询的结果集只能是1000条数据,倘若返回的是1w条数据,那么需要不断的通过or关键字去拼接多条in 的子查询。
还有一点,我们并非完全替代in的使用,在仅有寥寥几个的数值范围内查询(非子查询),也是可以用in的,如:in(0,1,2),在符合0,1,2的数集就可以用in。