我目前正在阅读 Abraham Silberschatz , Henry F. Korth 和 S的“数据库系统概念”。苏达山。
其中有一个删除示例,即删除所有薪水低于大学平均水平的所有讲师的记录。
它们显示以下查询:
delete from instructor
where salary < (select avg(salary)
from instructor);
我认为内部选择查询是不相关的子查询!意味着只应执行一次,然后再执行外部选择查询。
但是对于上述SQL代码段,他们提供了以下说明:
删除语句首先测试关系 instructor 中的每个元组,以检查工资是否低于大学教师的平均工资。然后,所有未通过测试的元组(即代表低于平均工资的讲师)将被删除。在执行任何删除操作之前执行所有测试是很重要的-如果在测试其他元组之前删除了某些元组,平均薪水可能会发生变化,删除的最终结果将取决于其中的顺序元组已处理!
以上文字表明内部选择查询是一个相关的子查询!对于外部关系的每一行,它执行内部子查询。
我不明白!
有人可以告诉我,是不相关还是相关子查询?为什么?
答案 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);
这将删除所有工资低于每个部门的平均工资的所有讲师。在这种情况下,子查询依赖于外部删除中涉及的表,因此该子查询是相关的。