Mysql:相关子查询
相关子查询
如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询 。
相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。相当于Java的两层嵌套for
题目1:查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id
方式1:
方式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中的子查询,则当前记录是会被查出来。