sql语句中嵌套时候用in 和=有啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql语句中嵌套时候用in 和=有啥区别相关的知识,希望对你有一定的参考价值。

sql语句中嵌套时候用in 和=有什么区别;
还有in 和exists区别,感觉不要这个exists也能查询出来;
我是菜鸟,请高手指教,谢谢!!!

如果子查询只有1条记录,in和=是没有区别,如果子查询有多条记录,用=会出错的,所以in是无论只查询有多少条记录都可以使用,而=只有当子查询只有1条记录的时候才能使用
in和exists理解上其实是差不多,但对数据库而言,in的执行顺序是先执行只查询条件,然后把记录和外查询核对,找符合条件的,
而exists是先执行外查询,再执行子查询,找到外查询记录后和只查询对比符合条件的,
如果外查询和子查询的条目数差异很大,那么效率相差很明显的
参考技术A 比如说,

条件 where A in 结果 (B, A 注:这里的A,B是 SQL 结果); 也就是 A = B
or A = A;

条件 where exist 结果 (B, A 注:这里的A,B是 SQL 结果);
exist 一般都需要和子表进行关联,而且关联时,需要用索引,这样就可以加快速度。

条件 A = 结果 A;

SQL : IN 和 Exists 的区别

Sql语句中IN和exists的区别及应用

  表展示

    首先,查询中涉及到的两个表,一个user和一个order表,具体表的内容如下:

    user表:

    

    order表:

    

 

  in

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

    具体sql语句如下:

  SELECT *
  FROM
      user
  WHERE
      user.id IN (
          SELECT
              order.user_id
          FROM
            order
     )

    这条语句很简单,通过子查询查到的user_id 的数据,去匹配user表中的id然后得到结果。该语句执行结果如下:

    

    它的执行流程是什么样子的呢?让我们一起来看一下。

    首先,在数据库内部,查询子查询,执行如下代码:

        SELECT
            order.user_id
        FROM
            order

    执行完毕后,得到结果如下:

    

    此时,将查询到的结果和原有的user表做一个笛卡尔积,结果如下:

    

    此时,再根据我们的user.id IN order.user_id的条件,将结果进行筛选(既比较id列和user_id 列的值是否相等,将不相等的删除)。最后,得到两条符合条件的数据。
    

  exists

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

    具体sql语句如下:

 
  SELECT*
  FROM
      user
  WHERE
      EXISTS (
          SELECT
             order.user_id
          FROM
             order
         WHERE
             user.id = order.user_id
     )
 

    这条sql语句的执行结果和上面的in的执行结果是一样的。

    

    但是,不一样的是它们的执行流程完全不一样:

    使用exists关键字进行查询的时候,首先,我们先查询的不是子查询的内容,而是查我们的主查询的表,也就是说,我们先执行的sql语句是:

     SELECT `user`.* FROM `user` 

    得到的结果如下:

    

    然后,根据表的每一条记录,执行以下语句,依次去判断where后面的条件是否成立:

EXISTS (
        SELECT
            order.user_id
        FROM
            order
        WHERE
            user.id = order.user_id
    )

    如果成立则返回true不成立则返回false。如果返回的是true的话,则该行结果保留,如果返回的是false的话,则删除该行,最后将得到的结果返回。

  区别及应用场景

    in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

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

  not in 和not exists

    如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

以上是关于sql语句中嵌套时候用in 和=有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

程序中使用嵌套的sql语句和在数据库中写存储过程调用它,有啥区别?

SQL里if语句和case语句有啥区别吗?哪个使用更高效?就是查询更优化?

sql server 中 in 和like 有啥区别?

SQL数据库中查询语句Order By和Group By有啥区别

Sql语句中IN和exists的区别及应用

存储过程和sql语句有啥区别