一、题目知识点汇总

这题主要的知识点就是对join的应用,考察对不同连接的理解。
左,右,内,外全连接:
左连接:表1 left join 表2 on 表1.字段=表2.字段  (以表1为准,表2进行匹配)
右连接:表1 right join 表2 on 表1.字段=表2.字段  (以表2为准,表1进行匹配)
全连接:表1 union all 表2 (表1 和表2的列数必须一样多,union 去除重复项,union all 不剔除重复项)
内连接:表1 inner join 表2(取表1和表2相交部分)
外连接:表1 full outer join 表2 (取表1和表2不相交的部分)

二、题目解读

1)请你查找在职员工自入职以来的薪水涨幅情况,
a、在职员工:to_date='9999-01-01'
b、薪水涨幅:不能用最大的薪资-最小的薪资,因为存在降薪情况,应该用最近日期的薪资-入职日期的薪资。

2)给出在职员工编号emp_no以及其对应的薪水涨幅growth,
表头
emp_no:
growth:当前薪资(to_date='9999-01-01'的薪资)-入职薪资(from_date=hire_date的薪资)

3)并按照growth进行升序
ORDER BY growth
题目中隐含的坑:即为涨幅的定义,我最开始的解法是直接拿最高薪资-最低薪资,这样做,当然是错的啦~

三、解题步骤

分两步走即可:首先根据已有的信息创建两张子表,分别是当前薪资表和入职薪资表;接着关联两张子表(这里注意要使用内连接哦~),用当前薪资表的薪资减去入职薪资表的薪资即为薪资增幅。
STEP1:创建两张薪资子表
SELECT emp_no,salary FROM salaries WHERE to_date='9999-01-01' #当前薪资表 t1
SELECT salaries.emp_no,salary FROM salaries JOIN employees WHERE hire_date=from_date #入职薪资表 t2
STEP2(完整代码):内关联两张表并求薪资差,并按照growth升序
SELECT emp_no,t1.salary-t2.salary AS growth
FROM (SELECT emp_no,salary FROM salaries WHERE to_date='9999-01-01')t1 #当前薪资表
INNER JOIN (SELECT salaries.emp_no,salary FROM salaries JOIN employees WHERE hire_date=from_date)t2 #入职薪资表
USING(emp_no) ORDER BY growth;