exist和 in
一、执行顺序
IN的执行过程如下:
1.首先运行子查询,获取子结果集2.主查询再去结果集里去找符合要求的字段列表,.符合要求的输出,反之则不输出。
Exists执行顺序如下:
- 进行外查询,即不是exists内部的查询;
- 将查询到的每一行结果都带入exists内部查询中,作为查询对象;
- 如果满足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
博客园地址:https://www.cnblogs.com/lixiuming521125/

浙公网安备 33010602011771号