SQL中的EXISTS子句和IN子句有什么区别?

什么时候应该使用EXISTS,什么时候应该使用IN?


当前回答

我相信这个问题有一个直截了当的答案。你为什么不从那些在他们的系统中开发了这个功能的人那里检查一下呢?

如果你是一个MS SQL开发人员,下面是来自微软的直接答案。

IN:

确定指定的值是否与子查询或列表中的任何值匹配。

存在:

指定子查询以测试是否存在行。

其他回答

如果使用IN操作符,SQL引擎将扫描从内部查询中获取的所有记录。另一方面,如果我们使用EXISTS, SQL引擎将在找到匹配项后立即停止扫描过程。

如果使用IN操作符,SQL引擎将扫描从内部查询中获取的所有记录。另一方面,如果我们使用EXISTS, SQL引擎将在找到匹配项后立即停止扫描过程。

我的理解是,只要我们不处理NULL值,两者都应该是相同的。

同样的原因,查询不返回值for = NULL vs is NULL。 http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/

至于布尔和comparator参数,为了生成一个布尔值,两个值都需要进行比较,这就是任何if条件的工作方式。所以我不明白IN和EXISTS的行为有什么不同 .

基于规则优化器:

当子查询结果非常大时,EXISTS比IN快得多。 当子查询结果很小时,IN比EXISTS快。

基于成本优化器:

没有区别。

在某些情况下,使用In比使用EXISTS更好。通常,如果选择谓词在子查询中,则使用In。如果选择谓词在父查询中,则使用EXISTS。

https://docs.oracle.com/cd/B19306_01/server.102/b14211/sql_1016.htm#i28403