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    主要用于具体的集合操作,    有多少满足条件.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值