数据库sql实战(14-18)

14:获取当前(to_date=’9999-01-01’)薪水第二多的员工的emp_no以及其对应的薪水salary

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

15.题目描述
查找当前薪水(to_date=’9999-01-01’)排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by

select e.emp_no,max(s.salary) as salary,e.last_name,e.first_name from employees as e join salaries as s on e.emp_no=s.emp_no
and s.to_date="9999-01-01" and s.salary<(select max(salary) from salaries)

16.查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工

select e.last_name,e.first_name,dp.dept_name 
from (employees as e left join dept_emp as d on e.emp_no=d.emp_no)
left join departments as dp on dp.dept_no=d.dept_no

17.查找员工编号emp_now为10001其自入职以来的薪水salary涨幅值growth

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

SELECT ( 
(SELECT salary FROM salaries WHERE emp_no = 10001 ORDER BY to_date DESC LIMIT 1) -
(SELECT salary FROM salaries WHERE emp_no = 10001 ORDER BY to_date ASC LIMIT 1)
) AS growth

18.查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_noy以及其对应的薪水涨幅growth,并按照growth进行升序


本题思路是先分别用两次LEFT JOIN左连接employees与salaries,建立两张表,分别存放员工当前工资(sCurrent)与员工入职时的工资(sStart),再用INNER JOIN连接sCurrent与sStart,最后限定在同一员工下用当前工资减去入职工资。
方法一:内层用LEFT JOIN,外层用INNER JOIN(内层也可以改用 INNER JOINSELECT sCurrent.emp_no, (sCurrent.salary-sStart.salary) AS growth
FROM (SELECT s.emp_no, s.salary FROM employees e LEFT JOIN salaries s ON e.emp_no = s.emp_no WHERE s.to_date = '9999-01-01') AS sCurrent
INNER JOIN (SELECT s.emp_no, s.salary FROM employees e LEFT JOIN salaries s ON e.emp_no = s.emp_no WHERE s.from_date = e.hire_date) AS sStart
ON sCurrent.emp_no = sStart.emp_no
ORDER BY growth

猜你喜欢

转载自blog.csdn.net/wuhuimin521/article/details/80552079