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 主要用于具体的集合操作, 有多少满足条件.
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秒。