🍋🍋大数据学习🍋🍋
🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞
相关子查询会针对外层查询的每一行单独执行,而不是一次性完成所有子查询操作。
这意味着子查询的执行次数等于外层查询表的行数。
SQL语句
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
子句会检查子查询返回的员工数量是否大于5WHERE 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)的部门名称。
总结
-
子查询的执行时机:子查询是在外层查询的每一行上动态执行的,而不是先独立完成所有子查询操作。
-
相关子查询的特点:子查询中引用了外层查询的表,因此每次执行时都会根据外层查询的当前行进行计算。
-
执行顺序:外层查询逐行处理,每行触发一次子查询,然后根据子查询的结果判断是否满足条件。