今天看SQL语句的时候发现了exists这个关键字,记得刚用这个关键字的时候只知道它和关键字IN的作用是一样的,当时觉得无非就是我的条件匹配到子结果集里面的数据。今天打算把这两个关键字具体怎么回事区分一下,上网上看了一下,懂了一些两者的区别,其中还涉及到了性能问题,很吃惊!

这里先说下EXISTS这个关键字,exists返回的是一个布尔值,oracle根据true或者false进行判断,如果为true,将结果保留进行,如果为false,则不保留。

EXISTS会先去进行主查询,也就是exists之前的部分,如:

select t.name,t.sex from A t where t.dr = 0 and exists (select m.id from B where m.pk = t.pk);

进行完主查询之后得到一个结果集,再对结果集的每一行去对exits后面的语句进行匹配,为真则保留,为false则不保留,最后返回查询的结果集。

注意:exists前面是不能加类似于字段名的,否则会报无效关系运算的错误,如图:

关于oracle中in和exists

IN关键字则是先去进行子查询,也就是IN之后的部分,如:

select t.name,t.sex from A t where t.dr = 0 and m.id in (select * from B m where m.pk = t.pk);

进行完子查询之后会得到一个结果集,和主表做笛卡尔积,然根据过滤条件得到最后的结果集。

到这里,可以知道,如果主查询要查的东西多,用exists,如果子表要查的东西多,用in。

特别说明

IN关键字在进行排序的时候使用的是hash join算法 连接表与表,

EXISTS关键字在进行排序的时候使用的是loop算法连接表与表。

这两种算法具体怎么回事还不清楚.............

这里介绍几个数据库里的名词:

在plsql中按F5会进行SQL语句的执行计划。以下几个名词可能会看到,截图如下:

关于oracle中in和exists

关于oracle中in和exists

相关文章: