In ------ 遍历
Exists ------- 检索到满足条件即退出
Not Exists --------检索到不满足条件即退出
本质区别:
Exists 由于Exist属于外驱动,故会利用索引来检索数据
In 则属于内驱动 故不能利用索引检索数据
其中,In和Not In类似全表扫描,效率低,一般用 Exist和NotExist代替其用法。
使用环境:
*Exists 使用外连接查询时用到。
*In 使用内连接查询时用到。
e.g.:
In 的用法:
Select Top 10 ExpoName,ExpoClassID From tb_Expo Where ExpoClassID in (Select Classid From tb_Expo_Class Where ParentID=0)
其中,先执行 Select Classid From tb_Expo_Class Where ParentID=0
等价于:
Select Top 10 a.ExpoName From tb_Expo a, (select Classid from tb_expo_class where parentid=0) b Where a.ExpoClassID= b.ClassID
而Exist不同:
select top 10 ExpoName,ExpoClassID from tb_Expo e where Exists (select 0 from tb_expo_class where parentid=0)
其执行类似于下面的sql:
set serveroutput on; declare l_count integer; begin for tb_Expo in (Select ExpoName,ExpoClassID From tb_Expo) loop Select count(*) into l_count From tb_Expo_Class where parentid = 0 if l_count != 0 then dbms_output.put_line(e.ExpoName); end if; end loop; end
在查询数据量大的时候就会体现出效率来。
当然,也不能说Exist就比In好。
如果
Select 0 from tb_expo_class where parentid=0
查询出来的数据量很少的话,还是 In 效率更高些。