接上一篇博客,此文将把剩下的题目全部记录完毕。预计在解题完毕后写一篇小的总结,因为在查询语句写的多的情况下,渐渐的感到其实套路还是蛮简单的,基本的思路比较容易想到,但其实更多的可能还是细节问题。。。

17:获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary
关键词:第二多
思路:无论第几 可以用limit关键字 之前有道题目(倒数第三,好像就是第二题)

select emp_no,salary 
from salaries as s 
where s.to_date = '9999-01-01'
order by s.salary desc 
limit 1,1

18:查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,你可以不使用order by完成吗
关键字:第二多 不用order by
思路:先选最大的“去掉”,剩下的最大值就是第二大;
思路二:嵌套加上自连接(挖坑待补)

select e.emp_no,s.salary,e.last_name,e.first_name
from employees e join  salaries s 
on e.emp_no=s.emp_no 
and  s.to_date='9999-01-01'
and s.salary = 
(select max(salary) from salaries/*选择第二名到最后一名中的最大值,即第二名*/
where salary<(select max(salary) from salaries where to_date='9999-01-01')/*选择薪水第二名到最后一名*/
and to_date='9999-01-01')

19:查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
关键词:包括未分配
思路:两次左连接 注意到左连接影响右边的表

SELECT em.last_name, em.first_name, dp.dept_name
FROM (employees AS em LEFT JOIN dept_emp AS de ON em.emp_no = de.emp_no)
LEFT JOIN departments AS dp ON de.dept_no = dp.dept_no

20:查找员工编号emp_no为10001其自入职以来的薪水salary涨幅(总共涨了多少)growth(可能有多次涨薪,没有降薪)
关键词:涨幅
思路:最大减去最小

SELECT (MAX(salary)-MIN(salary)) AS growth 
FROM salaries
WHERE emp_no = '10001'

21:查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序
关键词:类同上题(上一题选出两个值相减)
思路:类同上题(两个表相减)

SELECT sCurrent.emp_no, (sCurrent.salary-sStart.salary) AS growth
FROM (SELECT s.emp_no, s.salary FROM employees e, salaries s WHERE e.emp_no = s.emp_no AND s.to_date = '9999-01-01') AS sCurrent,
(SELECT s.emp_no, s.salary FROM employees e, salaries s WHERE e.emp_no = s.emp_no AND s.from_date = e.hire_date) AS sStart
WHERE sCurrent.emp_no = sStart.emp_no
ORDER BY growth

22:统计各个部门的工资记录数,给出部门编码dept_no、部门名称dept_name以及部门在salaries表里面有多少条记录sum
关键词:多少条记录
思路:将三张表连接起来,并且使用count函数即可,注意输出用编号分组,所以可以加一个group by

select d.dept_no ,dept.dept_name,count(salary) from salaries s ,dept_emp d,departments dept
where s.emp_no = d.emp_no and d.dept_no=dept.dept_no group by dept.dept_no

23:对所有员工的当前(to_date='9999-01-01')薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列
关键词:按照薪水排列并且薪水相同还要按序号排列
思路:利用语句s1.salary <= s2.salary,输出s1.salary为当前工资,而s2.salary为大于当前工资,去重计数就是排名

select s1.emp_no,s1.salary,count(distinct s2.salary) as rank
from salaries s1, salaries s2
where s1.salary <= s2.salary 
and s1.to_date = '9999-01-01' 
and s2.to_date = '9999-01-01'
group by s1.emp_no 
order by rank;

24:获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date='9999-01-01'
关键词:非manager
思路:not in 关键字

SELECT de.dept_no, e.emp_no, s.salary
FROM employees AS e INNER JOIN dept_emp AS de 
ON e.emp_no = de.emp_no
INNER JOIN salaries AS s 
ON e.emp_no = s.emp_no
WHERE de.to_date='9999-01-01' 
AND s.to_date='9999-01-01'
AND e.emp_no NOT IN(
SELECT emp_no FROM dept_manager WHERE to_date='9999-01-01'
);

25:获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date='9999-01-01'
(未完待续。。。)