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 查询通过子查询和连接操作,有效地获取了满足条件的员工和经理的相关薪水信息。