EXISTS的用法

  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即可。

大家在学习与工作灵活应用。

posted @ 2022-05-19 11:54  iRyz  阅读(674)  评论(0编辑  收藏  举报