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
  1. 总体思路这个 SQL 查询的目的是获取员工当前薪水比其经理当前薪水还高的相关信息。它从三个表(salaries、dept_emp和dept_manager)中提取数据,并进行连接和筛选操作。
  2. 子查询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。

  1. 子查询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。

  1. 主查询代码

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