SQL中的EXISTS子句和IN子句有什么区别?
什么时候应该使用EXISTS,什么时候应该使用IN?
SQL中的EXISTS子句和IN子句有什么区别?
什么时候应该使用EXISTS,什么时候应该使用IN?
当前回答
exists关键字可以这样使用,但实际上它是为了避免计数:
--this statement needs to check the entire table
select count(*) from [table] where ...
--this statement is true as soon as one match is found
exists ( select * from [table] where ... )
这是最有用的if条件语句,as exists可以比count快得多。
in最好用在你有一个静态列表要传递的地方:
select * from [table]
where [field] in (1, 2, 3)
当在in语句中有一个表时,使用连接更有意义,但大多数情况下这并不重要。无论哪种方式,查询优化器都应该返回相同的计划。在一些实现中(大多数是旧的,如Microsoft SQL Server 2000),查询将总是获得嵌套的连接计划,而连接查询将适当地使用嵌套、合并或散列。更现代的实现更智能,甚至可以在使用in时调整计划。
其他回答
据我所知,当子查询返回NULL值时,整个语句变成NULL。在这种情况下,我们使用EXITS关键字。如果我们想在子查询中比较特定的值,那么我们使用in关键字。
基于规则优化器:
当子查询结果非常大时,EXISTS比IN快得多。 当子查询结果很小时,IN比EXISTS快。
基于成本优化器:
没有区别。
exists关键字可以这样使用,但实际上它是为了避免计数:
--this statement needs to check the entire table
select count(*) from [table] where ...
--this statement is true as soon as one match is found
exists ( select * from [table] where ... )
这是最有用的if条件语句,as exists可以比count快得多。
in最好用在你有一个静态列表要传递的地方:
select * from [table]
where [field] in (1, 2, 3)
当在in语句中有一个表时,使用连接更有意义,但大多数情况下这并不重要。无论哪种方式,查询优化器都应该返回相同的计划。在一些实现中(大多数是旧的,如Microsoft SQL Server 2000),查询将总是获得嵌套的连接计划,而连接查询将适当地使用嵌套、合并或散列。更现代的实现更智能,甚至可以在使用in时调整计划。
我相信这个问题有一个直截了当的答案。你为什么不从那些在他们的系统中开发了这个功能的人那里检查一下呢?
如果你是一个MS SQL开发人员,下面是来自微软的直接答案。
IN:
确定指定的值是否与子查询或列表中的任何值匹配。
存在:
指定子查询以测试是否存在行。
IN只支持平等关系(或前面有NOT的不平等关系)。 它是=any / =some的同义词
select *
from t1
where x in (select x from t2)
;
EXISTS支持不能用IN表示的不同类型的关系,例如-
select *
from t1
where exists (select null
from t2
where t2.x=t1.x
and t2.y>t1.y
and t2.z like '℅' || t1.z || '℅'
)
;
还有另一种说法——
exist和IN之间所谓的性能和技术差异可能是由于特定供应商的实现/限制/错误造成的,但很多时候它们只是由于缺乏对数据库内部结构的理解而产生的神话。
表的定义、统计数据的准确性、数据库配置和优化器的版本都会影响执行计划,因此也会影响性能指标。