美文网首页
sql in与exists的区别,on 与 where的区别

sql in与exists的区别,on 与 where的区别

作者: 是归人不是过客 | 来源:发表于2018-11-19 11:29 被阅读9次

    一,in
    确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

    具体sql语句如下
    SELECT
    *
    FROM
    user
    WHERE
    user.id IN (
    SELECT
    order.user_id
    FROM
    order
    )
    它的执行流程是什么样子的呢?让我们一起来看一下。
    1, SELECT
    order.user_id
    FROM
    order
    2,将查询到的结果和原有的user表做一个笛卡尔积

    二,exists
    指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。

    具体sql语句如下:
    SELECT
    user.*
    FROM
    user
    WHERE
    EXISTS (
    SELECT
    order.user_id
    FROM
    order
    WHERE
    user.id = order.user_id
    )
    首先,我们先查询的不是子查询的内容,而是查我们的主查询的表,也就是说,我们先执行的sql语句是:
    1,SELECT user.* FROM user
    2,EXISTS (
    SELECT
    order.user_id
    FROM
    order
    WHERE
    user.id = order.user_id
    )
    三,区别及应用场景
     in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

    in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。

    四,on与where
    1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
    2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉

    相关文章

      网友评论

          本文标题:sql in与exists的区别,on 与 where的区别

          本文链接:https://www.haomeiwen.com/subject/etpofqtx.html