select
e_salary.emp_no,
m_salary.manager_no,
e_salary.emp_salary,
m_salary.manager_salary
from
(select
salaries.emp_no,
salary as emp_salary,
dept_no
from
salaries
left join
dept_emp
on salaries.emp_no = dept_emp.emp_no) as e_salary
join
(select
d.emp_no as manager_no,
salary as manager_salary,
d.dept_no
from
dept_manager d
left join
salaries
on d.emp_no = salaries.emp_no) as m_salary
on e_salary.dept_no = m_salary.dept_no
where
e_salary.emp_salary > m_salary.manager_salary
- 总体思路这个 SQL 查询的目的是获取员工当前薪水比其经理当前薪水还高的相关信息。它从三个表(salaries、dept_emp和dept_manager)中提取数据,并进行连接和筛选操作。
- 子查询e_salary代码
sql
(select
salaries.emp_no,
salary as emp_salary,
dept_no
from
salaries
left join
dept_emp
on salaries.emp_no = dept_emp.emp_no) as e_salary
- 解释这个子查询首先从salaries表和dept_emp表中获取数据。salaries.emp_no和salary分别表示员工编号和员工薪水,这里将salary重命名为emp_salary。dept_no是部门编号。使用LEFT JOIN将salaries表和dept_emp表连接起来,连接条件是salaries.emp_no = dept_emp.emp_no,确保每个员工都有对应的部门信息。最后,将这个子查询的结果集命名为e_salary。
- 子查询
m_salary代码
sql
(select
d.emp_no as manager_no,
salary as manager_salary,
d.dept_no
from
dept_manager d
left join
salaries
on d.emp_no = salaries.emp_no) as m_salary
- 解释这个子查询从dept_manager表和salaries表中获取数据。d.emp_no表示经理的员工编号,这里将其重命名为manager_no。salary表示经理的薪水,重命名为manager_salary。d.dept_no是经理所在的部门编号。使用LEFT JOIN将dept_manager表和salaries表连接起来,连接条件是d.emp_no = salaries.emp_no,确保每个经理都有对应的薪水信息。最后,将这个子查询的结果集命名为m_salary。
- 主查询代码
sql
select
e_salary.emp_no,
m_salary.manager_no,
e_salary.emp_salary,
m_salary.manager_salary
from
e_salary
join
m_salary
on e_salary.dept_no = m_salary.dept_no
where
e_salary.emp_salary > m_salary.manager_salary
- 解释从e_salary和m_salary两个子查询的结果集中选择所需的列:emp_no(员工编号)、manager_no(经理编号)、emp_salary(员工薪水)和manager_salary(经理薪水)。使用JOIN操作将e_salary和m_salary连接起来,连接条件是e_salary.dept_no = m_salary.dept_no,确保员工和经理在同一个部门。使用WHERE子句筛选出员工薪水大于经理薪水的记录,即e_salary.emp_salary > m_salary.manager_salary。
这个 SQL 查询通过子查询和连接操作,有效地获取了满足条件的员工和经理的相关薪水信息。

京公网安备 11010502036488号