exist和 in

一、执行顺序

IN的执行过程如下:

  1.首先运行子查询,获取子结果集
  2.主查询再去结果集里去找符合要求的字段列表,.符合要求的输出,反之则不输出。

Exists执行顺序如下:

  1. 进行外查询,即不是exists内部的查询;
  2. 查询到的每一行结果都带入exists内部查询中,作为查询对象;
  3. 如果满足exists查询条件,返回true,则该行结果成功被返回。

exists 查询说明:

查询时,一般情况下,子查询会分成两种情况:
1.子查询与外表的字段有关系时
select 字段1 , 字段2 from 表1 where exists (select 字段1 , 字段2 from 表2 where 表2.字段2 = 表1.字段2)
这时候,此SQL语句相当于一个关联查询。
它先执行表1的查询,然后把表1中的每一条记录放到表2的条件中去查询,如果存在,则显示此条记录。

2.子查询与外表的字段没有任何关联
Select 字段1 , 字段2 from 表1 where exists ( select * from 表2 where 表2.字段 = ‘ 条件‘)
只要子查询的结果大于等于1行,就会查询出外部主表中的所有记录,如果子查询中没有查询到记录(结果为空),则外部主表的结果也为空;
当子查询与主表不存在关联关系时,简单认为只要exists为一个条件判断,如果为true,就输出所有记录。如果为false则不输出任何的记录

 

二、in 和exist 的适用场景:

IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

表A(大表),表B(小表):
select * from A where cc in (select cc from B)效率高,用到了A表上cc列的索引;

表A(小表),表B(大表):
select * from A where exists (select cc from B where B.cc=A.cc) 效率高,用到了B表上cc列的索引。

 

三、in 转 EXISTS

SELECT
    * 
FROM
    tbl_employee_batch T01 
WHERE
    T01.IS_DELETED = 'N' 
     EXISTS ( SELECT 1 FROM tbl_employee T02 WHERE T01.LAST_NAME = T02.LAST_NAME AND T02.IS_DELETED = 'N' ) 
    AND T01.BATCH = '74c12f1815ba403d831d8037ad09c295' 
    AND T01.SOURCE = '2';

转exists

SELECT
    * 
FROM
    tbl_employee_batch T01 
WHERE
    T01.IS_DELETED = 'N' 
    AND LAST_NAME IN ( SELECT 1 FROM tbl_employee T02 WHERE T02.IS_DELETED = 'N' ) 
    AND T01.BATCH = '74c12f1815ba403d831d8037ad09c295' 
    AND T01.SOURCE = '2'

 


参考地址:https://blog.csdn.net/u010002184/article/details/122655241

posted @ 2021-06-24 20:54  啄木鸟伍迪  阅读(468)  评论(0)    收藏  举报
//火箭 GenerateContentList();