今天看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前面是不能加类似于字段名的,否则会报无效关系运算的错误,如图:
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语句的执行计划。以下几个名词可能会看到,截图如下: