天天看点

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 和exist 的适用场景:

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

继续阅读