正如其他人已经指出的那样,在相关子查询中使用 EXISTS 本质上是告诉数据库引擎“返回所有记录,其中有符合子查询中指定条件的相应记录。” 但还有更多。
EXISTS 关键字代表一个布尔值。它也可以被理解为“至少存在一条与 WHERE 语句中的条件匹配的记录”。换句话说,如果找到一条记录,“我已经完成了,我不需要进一步搜索”。
CAN 在相关子查询中使用 EXISTS 所带来的效率增益来自这样一个事实,即只要 EXISTS 返回 TRUE,子查询就会停止扫描记录并返回结果。类似地,只要任何记录与子查询的 WHERE 语句中的条件匹配,使用 NOT EXISTS 的子查询就会返回。
我相信这个想法是使用 EXISTS 的子查询应该避免使用嵌套循环搜索。正如上面的@Gordon Linoff 所说,查询优化器可能会也可能不会按预期执行。我相信 MS SQL Server 通常会充分利用 EXISTS。
我的理解是,并非所有查询都能从 EXISTS 中受益,但它们通常会受益,尤其是在您的示例中的简单结构的情况下。
我可能已经扼杀了其中的一些,但从概念上讲,我相信它在正确的轨道上。
需要注意的是,如果您有一个性能关键的查询,最好使用 EXISTS 评估一个版本的执行,正如 Linoff 先生所说的那样,使用简单的 JOINS。根据您的数据库引擎、表结构、一天中的时间以及月亮和星星的对齐方式,它不是一刀切的,它会更快。
最后一点 - 我同意 lc。当您在子查询中使用 SELECT * 时,您很可能会否定部分或全部性能提升。仅选择 PK 字段。