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都要测试,如果为真,那么外查询选择一个姓名和技能 |
|