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

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


当前回答

我认为,

EXISTS是当您需要将查询结果与另一个子查询匹配时。 查询#1的结果需要在SubQuery结果匹配的地方检索。有点像Join.. 例如,选择表1中也下过表2订单的客户 IN用于检索特定列的值是否位于列表(1,2,3,4,5)中 例如,选择位于以下邮政编码中的客户,即zip_code值位于(....)列表中。

什么时候使用一种而不是另一种……当你觉得读起来合适的时候(更好地传达意图)。

其他回答

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

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

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

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

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

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

据我所知,当子查询返回NULL值时,整个语句变成NULL。在这种情况下,我们使用EXITS关键字。如果我们想在子查询中比较特定的值,那么我们使用in关键字。

哪个更快取决于内部查询获取的查询数量:

当您的内部查询获取数千行,那么EXIST将是更好的选择 当您的内部查询获取少量行时,那么IN将更快

EXIST对true或false进行评估,但在比较多个值。当你不知道记录是否存在时,你应该选择exist