这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。
下面是任一查询的结果集:
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中的每一个值都不相等时 为真
转载自http://wp19908.javaeye.com/blog/148024
在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.
转载自http://hi.baidu.com/hopedaily/blog/item/56d23edbde87cd60d0164efe.html
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'
的结果是相同的。
sql中in和exist语句的区别?
1、适用表的类型不同。in是子查询为驱动表,外面的表为被驱动表,故适用于子查询结果集小而外面的表结果集大的情况。exists是外面的表位驱动表,子查询里面的表为被驱动表,故适用于外面的表结果集小而子查询结果集大的情况。2、子查询关联不同。exists一般都是关联子查询。对于关联子查询,必须先执...
SQL中IN和EXISTS用法的区别
SQL中IN和EXISTS用法的区别 1.exist,not exist一般都是与子查询一起使用. In可以与子查询一起使用,也可以直接in (a,b...)。2.exist会针对子查询的表使用索引. not exist会对主子查询都会使用索引. in与子查询一起使用的时候,只能针对主查询使用索引. not in则不会使用任何索引. 注意,一直以来...
SQL 中的 in 与 not in、exists 与 not exists 的区别以及性能分析
两者在某些情况下结果相同,但in更强调集合匹配,而=则更为精确。4. EXISTS的性能分析:当子查询结果集小,主表大且有索引时,in效率更高。反之,主表小、子表大且有索引时,exists更优。5. NOT IN与NOT EXISTS:两者在某些需求下不能互换,NOT EXISTS通常更推荐,尤其是在基于成本的优化中。具体...
Sql 语句中 IN 和 EXISTS 的区别及应用
IN与EXISTS的区分:IN适用于子查询结果集小、主查询表大且有索引的场景;EXISTS适用于主查询记录少、子查询表大且有索引的场景。主要区别在于驱动顺序改变,影响性能。IN与EXISTS性能比较:IN使用hash连接,EXISTS使用循环与内表查询。认为EXISTS总是比IN效率高的说法是不准确的。not in与not exists:使用...
sql exist和in的区别及查询效率比较
对于以上两种情况,in是在内存里遍历比较,而exists需要查询数据库,所以当B表数据量较大时,exists效率优于in。1、IN()语句内部工作原理 IN()只执行一次,它查出B表中的所有id字段并缓存起来。之后,检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录。
MySQL查询语句中的IN 和Exists 对比分析
在SQL查询中,IN和Exists的选择常常引起思考。经过实践对比,IN的查询效率通常高于Exists,但这个结论是否适用于所有场景呢?本文将通过实际案例解析两者在不同情况下的执行过程和效率差异。实验使用两张表:t_author(13,355条记录)和t_poetry(289,917条记录)进行分析。对于外表小内表大的情况,如IN的...
SQL查询中in和exists的区别分析
in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。如果查询的两个表大小相当,那么用in和exists差别不大。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
【PL\/SQL】EXISTS 函数 比 IN 更优
Exist函数的用法,比IN函数在某些场景下更优,主要体现在返回数据的效率和使用范围上。Exist函数在SQL查询中,常被用于在主查询的where筛选语句后,通过子查询实现表间匹配。Exist函数的语法格式为:Exist(查询结果集)。如果子查询返回结果集有记录,则判定为真,否则为假。其逻辑类似于:查询结果集存在则...
来谈谈SQL中的in与not in、exists与not exists的区别
在SQL中,in与not in、exists与not exists的效率和适用场景有所区别。首先,in通过哈希连接处理两个表,而exists则通过外层表循环查询内表,通常认为exists在处理大表时效率较高,但这并不绝对。如果两个表大小相当,两者性能差距不大。当子查询表较大时,应使用exists;反之,子查询表较小,in更合适...
SQL中IN与NOT IN的区别是什么?
在SQL中,IN和NOT IN,以及EXISTS和NOT EXISTS,是四种用于数据查询的关键字。它们各自有着不同的工作方式和性能特点,理解它们之间的区别对于优化查询效率至关重要。首先,IN和EXISTS在性能上有所不同。IN是将外部表和内部表进行哈希连接,而EXISTS则是对外部表进行循环,每次循环再对内部表进行查询。理...