SQL Select中的in和exists的区别

inexistsSQL执行效率分析

A
B两个表,
(1)
当只显示一个表的数据如A,关系条件只一个如ID时,使用IN更快:
select * from A where id in (select id from B)
  select * from A

(2)当只显示一个表的数据如A,关系条件不只一个如IDcol1时,使用IN就不方便了,可以使用EXISTS

where exists (select 1 from B where id = A.id and col1 = A.col1)
(3)
当只显示两个表的数据时,使用INEXISTS都不合适,要使用连接:
  select * from A left join B on id = A.id
所以使用何种方式,要根据要求来定。

 

SQLin可以分为三类:
1
、形如select * from t1 where f1 in ('a','b'),应该和以下两种比较效率


2
、形如select * from t1 where f1 in (select f1 from t2 where t2.fx='x')

select * from t1 where f1='a' or f1='b'或者 select * from t1 where f1 ='a' union all    select * from t1 f1='b'  

其中子查询的where里的条件不受外层查询的影响,这类查询一般情况下,自动优化会转成exist语句,也就是效率和exist一样。

3、形如select * from t1 where f1 in (select f1 from t2 where t2.fx=t1.fx)

其中子查询的where里的条件受外层查询的影响,这类查询的效率要看相关条件涉及的字段的索引情况和数据量多少,一般认为效率不如exists。除了第一类in语句都是可以转化成exists 语句的SQL,一般编程习惯应该是用exists而不用in,而很少去考虑inexists的执行效率.

 

 

inexists

in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为existsin效率高的说法是不准确的。

如果查询的两个表大小相当,那么用inexists差别不大。

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in

例如:表A(小表),表B(大表)1select * from A where cc in (select cc from B)

效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)

效率高,用到了B表上cc列的索引。

相反的2select * from B where cc in (select cc from A)

效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)

效率低,用到了A表上cc列的索引。

not in not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

in =的区别

select name from student where name in ('zhang','wang','li','zhao');

select name from student where name='zhang' or name='li' or name='wang' or name='zhao'

的结果是相同的。

//-----------------------------------------------------

SQL ANY ALL 的理解

 

SQL ANY ALL 的理解

1.All:对所有数据都满足条件,整个条件才成立,例如:5大于所有返回的id
select *
from A
where 5>All(select id from A)
go

2.Any:只要有一条数据满足条件,整个条件成立,例如:3大于12
select *
from A
where 3>any(select id from A)
go
3.Some
Any一样

--end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值