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