SQL中的EXISTS子句和IN子句有什么区别?
什么时候应该使用EXISTS,什么时候应该使用IN?
SQL中的EXISTS子句和IN子句有什么区别?
什么时候应该使用EXISTS,什么时候应该使用IN?
当前回答
EXISTS的性能比in快。 如果大多数过滤条件在子查询中,那么最好使用in,如果大多数过滤条件在主查询中,那么最好使用EXISTS。
其他回答
在某些情况下,使用In比使用EXISTS更好。通常,如果选择谓词在子查询中,则使用In。如果选择谓词在父查询中,则使用EXISTS。
https://docs.oracle.com/cd/B19306_01/server.102/b14211/sql_1016.htm#i28403
EXISTS的性能比in快。 如果大多数过滤条件在子查询中,那么最好使用in,如果大多数过滤条件在主查询中,那么最好使用EXISTS。
基于规则优化器:
当子查询结果非常大时,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时调整计划。
我的理解是,只要我们不处理NULL值,两者都应该是相同的。
同样的原因,查询不返回值for = NULL vs is NULL。 http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/
至于布尔和comparator参数,为了生成一个布尔值,两个值都需要进行比较,这就是任何if条件的工作方式。所以我不明白IN和EXISTS的行为有什么不同 .