Mysql:相关子查询

相关子查询

如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询
相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。相当于Java的两层嵌套for
image

题目1:查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id
方式1:
image

方式2:

SELECT last_name,salary,e1.department_id 
FROM employees e1,
(	SELECT department_id,AVG(salary) dept_avg_sal 
	FROM employees 
	GROUP BY department_id) e2 
WHERE e1.`department_id` = e2.department_id AND e2.dept_avg_sal < e1.`salary`;

题目2:若employees表中employee_id与job_history表中employee_id相同的数目不小于2,输出这些相同id的员工的employee_id,last_name和其job_id

SELECT e.employee_id, last_name,e.job_id
FROM employees e 
WHERE 2 <= (
	SELECT COUNT(*) 
	FROM job_history 
	WHERE employee_id = e.employee_id
);

EXISTS 与 NOT EXISTS关键字

子查询是经常和EXISTS 与 NOT EXISTS来搭配使用。英译是存在和不存在的意思,但他的用法更符合“满足”的意思。
题目1:查询公司管理者的employee_id,last_name,job_id,department_id信息

SELECT employee_id, last_name, job_id, department_id 
FROM employees e1 
WHERE EXISTS ( 
	SELECT 1 FROM employees e2 WHERE e2.manager_id = e1.employee_id
);

遍历e1表的数据,当前行记录如果满足于EXISTS中的子查询,则当前记录是会被查出来。

题目2:查询departments表中,不存在于employees表中的部门的department_id和department_name

SELECT 
department_id, 
department_name 
FROM departments d
WHERE NOT EXISTS (
	SELECT 1 FROM employees WHERE department_id = d.department_id
);

遍历e1表的数据,当前行记录如果不满足于EXISTS中的子查询,则当前记录是会被查出来。

posted @ 2022-09-14 13:56  爱编程DE文兄  阅读(65)  评论(0编辑  收藏  举报