sql - 这是相关子查询还是非相关子查询?
问题描述
我目前正在阅读Abraham Silberschatz、Henry F. Korth和S. Sudarshan撰写的“数据库系统概念” 。
其中有一个删除的例子,就是删除所有工资低于大学平均水平的教师的记录。
他们显示以下查询:
delete from instructor
where salary < (select avg(salary)
from instructor);
我认为内部选择查询是不相关的子查询!意味着它应该只执行一次然后外部选择查询。
但他们为上述 SQL 代码片段提供了以下解释:
删除语句首先测试关系教师中的每个元组,以检查工资是否低于大学教师的平均工资。然后,所有未通过测试的元组(即代表工资低于平均水平的教师)都将被删除。在执行任何删除之前执行所有测试很重要——如果在测试其他元组之前删除了一些元组,平均工资可能会改变,删除的最终结果将取决于处理元组的顺序!
上面的文字表明内部选择查询是一个相关的子查询!意味着它执行内部子查询的每一行外部关系。
我不明白!
谁能告诉我,这是不相关的还是相关的子查询?为什么?
解决方案
在您当前的查询中,出现在WHERE
子句中的子查询不相关:
DELETE
FROM instructor
WHERE salary < (SELECT AVG(salary) FROM instructor);
SQL Server 优化器应该对平均子查询进行一次评估,并缓存该结果以在删除查询中使用。
但是,请考虑子查询相关的以下版本:
DELETE
FROM instructor i1
WHERE i1.salary < (SELECT AVG(i2.salary) FROM instructor i2
WHERE i2.department = i1.department);
这将删除所有工资恰好低于每个部门平均水平的教师。在这种情况下,子查询依赖于外部删除所涉及的表,因此该子查询是相关的。
推荐阅读
- angular - 我正在在线学习 Angular 4 HTTP,并且我正在使用 Angular 7 进行练习,所以我认为这就是我收到此错误的原因
- python - 每月平均交易额
- django - 在 Django 模板中显示同一行中的文本
- ios - ld:找不到框架 Alamofire 5.0
- asp.net-mvc - Date DataAnnotation 验证属性不起作用 - 显示时间
- http - Smartsheet API“连接时出现问题”
- list - 如何在颤动中找到包含另一个列表的任何元素的列表?
- java - 我想在 android 中使用闪烁动画更改图像,并且图像是使用 Glide 直接从服务器加载的。或任何其他选择来做到这一点?
- java - 如何在我正在开发的插件中添加凭据的下拉字段
- javascript - 使用 JS 样式的图像叠加