黑马程序员技术交流社区

标题: 用Not Exists 代替Not In [打印本页]

作者: xiaoGongjv_    时间: 2017-8-9 14:02
标题: 用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都要测试,如果为真,那么外查询选择一个姓名和技能




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2