in 与Exits的区别

1.比较和扫描方法不一样,一般IN慢,要全表扫描,不能使用索引.并且当子查询与IN或NOT IN连用时,子查询返回一个或多个结果值,当子查询与EXISTS或NOT EXISTS连用时,
检查是否有符合子查询条件的结果,返回值为TRUE或FALSE。

我作了一个存储过程,里面一段原先是这样的:
SELECT * FROM TABLENAME
WHERE DELETE_FLAG IN ('R','U','D')
AND LEG_ID NOT IN
(SELECT LEG_ID
FROM T_CURRENTFLTLEG);
由于这个表大,记录数大约上万,结果用去我15秒时间。
后来,改成这样:
SELECT * FROM TABLENAME M
WHERE DELETE_FLAG IN ('R','U','D')
AND NOT EXISTS (SELECT LEG_ID FROM
T_CURRENTFLTLEG T
WHERE T.LEG_ID = M.LEG_ID);
竟然只要0.15秒。


2.IN
确定给定的值是否与子查询或列表中的值相匹配。
EXISTS
指定一个子查询,检测行的存在。

         下面从具体的语句来看:
select * from 表A where exists(select * from 表B where 表B.id=表A.id)

这句相当于

select * from 表A where id in (select id from 表B)


对于表A的每一条数据,都执行select * from 表B where 表B.id=表A.id的存在性判断,如果表B中存在表A当前

行相同的id,则exists为真,该行显示,否则不显示


3.    exists主要用于片面的,有满足一个条件的即可,  
     in    主要用于具体的集合操作,    有多少满足条件.

你可能感兴趣的:(in 与Exits的区别)