方法一:

思路:

这题不是单纯求工资的最大值减最小值。 而是员工当前薪资减去入职时的薪资。

①先创建两个子查询,分别找出所有员工当前的薪水(如子查询 a)和所有员工入职时的薪水(如子查询 b)

②a,b 子查询运用的方法都是一样的,联结 employees 表和 salaries 表,左联结内联结都可以,子查询 a 限定条件直接为当前时间 '9999-01-01',子查询 b 限定条件为入职时间,每个员工入职时间不一样,所以要使用谓词 in 找出在工资表里所有员工对应的最小时间。最后 a,b 子查询都要对员工编号进行分组。

③最后将这两个子查询联结,联结条件为 a.emp_no = b.emp_no,再按照题目要求对薪水涨幅进行升序排序。

代码:

SELECT
    a.emp_no,
    (a.salary - b.salary) AS growth
FROM
    (
        SELECT
            e.emp_no,
            max(s.salary) salary
        FROM
            employees e
            LEFT JOIN salaries s ON e.emp_no = s.emp_no
        WHERE
            s.to_date = '9999-01-01'
        GROUP BY
            s.emp_no
    ) a,
    (
        SELECT
            e.emp_no,
            min(s.salary) salary
        FROM
            employees e
            LEFT JOIN salaries s ON e.emp_no = s.emp_no
        WHERE
            s.to_date IN (
                SELECT
                    min(to_date)
                FROM
                    salaries s
                GROUP BY
                    s.emp_no
            )
        GROUP BY
            s.emp_no
    ) b
WHERE
    a.emp_no = b.emp_no
ORDER BY
    growth ASC;

方法二:

思路:

思路也是先查找如入职的工资,和当前在职工资,求差值即可。 但是这里只用了 salaries 这一张表

代码:

select
    a.emp_no,
    (a.salary - b.salary) growth
from
    (
        select
            emp_no,
            salary
        from
            salaries
        where
            to_date = '9999-01-01'
    ) a,
    (
        select
            emp_no,
            salary
        from
            salaries
        where
            to_date in (
                select
                    min(to_date)
                from
                    salaries
                group by
                    emp_no
            )
    ) b
where
    a.emp_no = b.emp_no
order by
    growth