主页 » 正文

SQL查询中in和exists的区别分析

十九科技网 2025-06-25 13:56:28 211 °C

IN 

确定给定的值是否与子查询或列表中的值相匹配。

EXISTS 

指定一个子查询,检测行的存在。

比较使用 EXISTS 和 IN 的查询 

这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。 

USE pubs 

GO 

SELECT DISTINCT pub_name 

FROM publishers 

WHERE EXISTS 

(SELECT * 

FROM titles 

WHERE pub_id = publishers.pub_id 

AND type = 'business') 

GO 

-- Or, using the IN clause: 

USE pubs 

GO 

SELECT distinct pub_name 

FROM publishers 

WHERE pub_id IN 

(SELECT pub_id 

FROM titles 

WHERE type = 'business') 

GO

下面是任一查询的结果集: 

pub_name 

---------------------------------------- 

Algodata Infosystems 

New Moon Books 

(2 row(s) affected)

 

exits 相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合.例如 exist P 表示P不空时为真; not exist P表示p为空时 为真 in表示一个标量和一元关系的关系。例如:s in P表示当s与P中的某个值相等时 为真; s not in P 表示s与P中的每一个值都不相等时 为真

转载自

在Oracle SQL中取数据时有时要用到in 和 exists 那么他们有什么区别呢? 

1 性能上的比较 

比如Select * from T1 where x in ( select y from T2 ) 

执行的过程相当于: 

select * 

  from t1, ( select distinct y from t2 ) t2 

where t1.x = t2.y; 

相对的 

select * from t1 where exists ( select null from t2 where y = x ) 

执行的过程相当于: 

for x in ( select * from t1 ) 

   loop 

      if ( exists ( select null from t2 where y = x.x ) 

      then 

         OUTPUT THE RECORD 

      end if 

end loop 

表 T1 不可避免的要被完全扫描一遍 

分别适用在什么情况? 

以子查询 ( select y from T2 )为考虑方向 

如果子查询的结果集很大需要消耗很多时间,但是T1比较小执行( select null from t2 where y = x.x )非常快,那么exists就比较适合用在这里 

相对应得子查询的结果集比较小的时候就应该使用in.

转载自

in和exists

in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。

一直以来认为exists比in效率高的说法是不准确的。

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

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

例如:表A(小表),表B(大表)

1:

select * 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列的索引。

相反的

2:

select * 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'

的结果是相同的。

版权声明:部分内容由互联网用户自发贡献,如有侵权/违规,请联系删除
本平台仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

本文链接地址:/dsj/214924.html

相关文章

什么是CPU的主频、外频、

CPU主要的性能指标有: ○主频 主频也叫时钟频率,单位是MHz,用来表示CPU的运算速度。CPU的主频=外频×倍频系数。很多人认为主频就决定着CPU的运行速度,这不仅是个片面的,而且对

大数据 2025-06-24 198 °C

DDN的用途有哪些?

DDN的用途有哪些? DDN网络的应用 DDN网络提供的业务 由于DDN网是一个全透明网络,能提供多种业务来满足各类用户的需求。 提供速率可在一定范围内(200bit/s—2Mbit/s)任选的信息量大实

大数据 2025-06-23 213 °C

高追加分数!请问PSTN、

ADSL(Asymmetric Digital Subscriber Line)的中文名称即非对称数字用户专线。 传统的电话线使用了0KHz~4KHz的低频段进行语音传送,而电话线理论上有接近2MHz的带宽,窄带N—ISDN进行抽样编码

大数据 2025-06-23 223 °C