大数据学习
系列专栏: 哲学语录: 用力所能及,改变世界。
如果觉得博主的文章还不错的话,请点赞+收藏⭐️+留言支持一下博主哦
相关子查询会针对外层查询的每一行单独执行,而不是一次性完成所有子查询操作。
这意味着子查询的执行次数等于外层查询表的行数。
SELECT department_name
FROM departments d
WHERE 5 < (
SELECT COUNT(*)
FROM employees e
WHERE d.department_id = e.department_id
);
外层查询逐行处理:
外层查询从 departments
表中逐行读取数据,每次处理一个部门。
每次处理时,d.department_id
是当前行的部门ID,d.department_name
是当前行的部门名称。
子查询针对当前行执行:
对于外层查询的每一行(即每个部门),子查询都会被触发并执行。
子查询的作用是统计与当前部门(d.department_id
)匹配的员工数量
SELECT COUNT(*)
FROM employees e
WHERE d.department_id = e.department_id
子查询的结果是一个数字,表示当前部门的员工数量。
条件判断:
外层查询的 WHERE
子句会检查子查询返回的员工数量是否大于5
WHERE 5 < (子查询的结果)
如果条件满足,则将当前部门的 department_name
添加到结果集中。
重复上述步骤:
对 departments
表中的每一行重复上述步骤,直到所有部门都被处理完毕。
相关子查询是指子查询中引用了外层查询的表(在这个例子中是 d.department_id
)。
相关子查询会针对外层查询的每一行单独执行,而不是一次性完成所有子查询操作。
这意味着子查询的执行次数等于外层查询表的行数。
假设 departments
表中有3个部门,执行过程如下:
处理第一个部门(department_id = 1
):
子查询统计部门1的员工数量
SELECT COUNT(*)
FROM employees e
WHERE e.department_id = 1
假设结果是3。
判断条件 5 < 3
不满足,部门1的名称不会被选中。
处理第二个部门(department_id = 2
):
子查询统计部门2的员工数量
SELECT COUNT(*)
FROM employees e
WHERE e.department_id = 2
假设结果是2。
判断条件 5 < 2
不满足,部门2的名称不会被选中。
处理第三个部门(department_id = 3
):
子查询统计部门3的员工数量
SELECT COUNT(*)
FROM employees e
WHERE e.department_id = 3
假设结果是6。
判断条件 5 < 6
满足,部门3的名称会被选中。
最终结果是所有满足条件(员工数量大于5)的部门名称。
子查询的执行时机:子查询是在外层查询的每一行上动态执行的,而不是先独立完成所有子查询操作。
相关子查询的特点:子查询中引用了外层查询的表,因此每次执行时都会根据外层查询的当前行进行计算。
执行顺序:外层查询逐行处理,每行触发一次子查询,然后根据子查询的结果判断是否满足条件。