大家好,欢迎来到IT知识分享网。
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。
哦?那这个应该怎么来理解呢,通俗的来讲的话,你大可以把 EXISTS 当作 IN 来用。当然我不是说 它们两个 一样,只是说大体上 它们的用法差不多,因为初学者对in要了解的多一些,所以可以先这样认为。
首先来看 select…from…where… … in(select…from…)
Select…from…where…exists(select…from…)
在句式上看都差不多,区别在于in后面的子句里返回了查询查到的一些具体的值,而exists的子句则是返回了一个根据查询结果集空或非空来决定的布尔值。
再来看具体执行过程,
exists:执行外部的查询 – 对于外部查询结果的每一行都进行一次exists括号里的子查询(执行子查询时都会引用外部查询中当前行的值) – 用子查询的结果(true/false)来决定外部查询的某一行是否作为结果输出。切记每次外部查询的每一行结果都会执行一次子查询。
In:执行子查询得到一个结果集 – 主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出。
读到此处,关于效率问题跃然而出。
in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in即可。
大家在学习与工作灵活应用。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/34682.html