本文主要分析了in和exists的区别与执行效率的问题:
in可以分为三类:
1、形如select * from t1 where f1 in ( 'a ', 'b '),应该和以下两种比较效率。
select * from t1 where f1= 'a ' or f1= 'b '
|
或者
select * from t1 where f1 = 'a '
union all select * from t1 f1= 'b '
|
你可能指的不是这一类,这里不做讨论。
2、形如
select * from t1 where f1 in
(select f1 from t2 where t2.fx= 'x '),
|
其中子查询的where里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,也就是效率和exist一样。
3、形如
select * from t1 where f1 in
(select f1 from t2 where t2.fx=t1.fx),
|
其中子查询的where里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如exists。
除了第一类in语句都是可以转化成exists 语句的,一般编程习惯应该是用exists而不用in.
A,B两个表,
(1)当只显示一个表的数据如A,关系条件只一个如ID时,使用IN更快:
select * from A where id in (select id from B)
|
(2)当只显示一个表的数据如A,关系条件不只一个如ID,col1时,使用IN就不方便了,可以使用EXISTS:
select * from A
where exists (select 1 from B where id = A.id and col1 = A.col1)
|
1
2
3
下一页>>