相关子查询

相关子查询是引用不列在其 FROM 子句中的表的列的子查询。该列可以在 Projection 子句或在 WHERE 子句中。要查找相关子查询引用的表,搜索列直到找到相关为止。

通常,相关子查询会降低性能。在子查询中使用表名或别名,这样就不会对所在的表产生疑问。

数据库服务器将使用外查询来获取值。例如:如果表 taba 具有列 col1,表 tabb 具有列 col2,并且它们包含以下内容:
taba.col1       aa,bb,null
          tabb.col2       bb, null
那么查询为:
select * from taba where col1 in (select col1 from tabb);
那么结果可能会毫无意义。数据库服务器将提供 taba.col1 中所有的值,并接着它们与 taba.col1 进行比较(外查询 WHERE 子句)。这将返回所有的行。通常使用子查询从内表返回列值。如果查询写成:
select * from taba where col1 in (select tabb.col1 from tabb);

那么将导致错误 error -217 column not found

相关子查询的重要功能是,由于它取决于来自外部 SELECT 的值。所以必须重复执行它,对外部 SELECT 产生的每个值执行一次。非相关子查询只能执行一次。