这是相关子查询还是不相关子查询?

时间:2020-03-28 06:55:02

标签: sql

我目前正在阅读 Abraham Silberschatz Henry F. Korth S的“数据库系统概念”。苏达山

其中有一个删除示例,即删除所有薪水低于大学平均水平的所有讲师的记录。

它们显示以下查询:

delete from instructor 
where salary < (select avg(salary) 
                from instructor);

我认为内部选择查询是不相关的子查询!意味着只应执行一次,然后再执行外部选择查询。

但是对于上述SQL代码段,他们提供了以下说明:

删除语句首先测试关系 instructor 中的每个元组,以检查工资是否低于大学教师的平均工资。然后,所有未通过测试的元组(即代表低于平均工资的讲师)将被删除。在执行任何删除操作之前执行所有测试是很重要的-如果在测试其他元组之前删除了某些元组,平均薪水可能会发生变化,删除的最终结果将取决于其中的顺序元组已处理!

以上文字表明内部选择查询是一个相关的子查询!对于外部关系的每一行,它执行内部子查询。

我不明白!

有人可以告诉我,是不相关还是相关子查询?为什么?

1 个答案:

答案 0 :(得分:3)

在您当前的查询中,list_options = [{'q': 'does the blue present in the flag?', 'y':['israel'], 'n': ['japan', 'usa']}, {'q': 'is the circle in the flag?', 'y': ['japan'], 'n': ['usa']}]子句中出现的子查询是不相关的:

WHERE

SQL Server优化器应该对平均子查询进行一次评估,并缓存要在删除查询中使用的结果。

但是,请考虑以下与子查询相关的版本:

DELETE
FROM instructor 
WHERE salary < (SELECT AVG(salary) FROM instructor);

这将删除所有工资低于每个部门的平均工资的所有讲师。在这种情况下,子查询依赖于外部删除中涉及的表,因此该子查询是相关的。