用Not Exists 代替Not In

Not Exists允许用户使用相关子查询已排除一个表中能够与另一个表成功连接的所有记录。

Select a.mobileid
  from Log_user a
where not exists
  (select b.mobileid from magazineitem b
     where b.mobileid=a.mobileid);

对于外查询的每条记录(Log_user),not exists字查询都要测试。如果这条记录于Magazineitem连接后返回一行,则子查询成功。Not Exists 通知查询对返回的代码取反,这样,Log_user 表中与Log_User连接成功的行都不为外查询返回。剩下的行就是那些在magazineitem中没有记录的。
Not Exists用到了连接,能够发挥已经建好的索引的作用,而Not In不能使用索引。

Not In是最慢的方式,要同每条记录比较,在数据量比较大的查询中不建议使用这种方式。

关于Exists和IN:
Select name,skill
  from workerstill ws
  where exists
   (select * from workskill
    where ws.name=name
     group by name
      having count(skill)>1);

检查每个外查询的值,ExistS都要测试,如果为真,那么外查询选择一个姓名和技能

EXISTS是存在性的一种测试,特点:
1。不能匹配一列或者多列
2。只能用于相关的子查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值