二者并没有严格的效率高低之分,甚至依赖于数据库中数据的组织方式。
exists的效率依赖于匹配度, join的效率则比较稳定。比如,对 select * from tableA as ta where exists (select 1 from tableB as tb where ta.id = tb.id); 每扫描ta一行,就会扫描tb,遇到匹配就返回true,没遇到匹配就会把tb一直扫描下去。
举个极端, tb中每行的id都与ta中每行id相同
即 ta
id
1
1
1
1
1
,,,
tb
id
1
1
1
1
1
1
一扫就有返回,效率极高
反之
ta
id
1
1
1
1
1
1
1
...
tb
id
0
0
0
0
0
0
..
每扫ta一行,都要扫完tb,效率极差。
内连接效率则稳定。 在不很清楚实际数据分布情况下,最好用内连接。 .
[华 软 网]