SQL21 查找在职员工自入职以来的薪水涨幅情况
select a.emp_no, (a.salary - b.salary) growthfrom (select emp_no,salary from salaries where to_date = '9999-01-01') a, (select s.emp_no,salary from salaries s join employees e on s.emp_no=e.emp_no and s.from_date = e.hire_date) bwhere a.emp_no = b.emp_noorder by growth
解题思路:
①先创建两个子查询,分别找出所有员工当前的薪水(如子查询a)和所有员工入职时的薪水(如子查询b);
②子查询a限定条件直接为当前时间'9999-01-01',子查询b限定条件为入职时间;
③最后将这两个子查询联结,联结条件为a.emp_no = b.emp_no,再按照题目要求对薪水涨幅进行升序排序。
SQL22 统计各个部门的工资记录数
select d.dept_no, d.dept_name, count(s.salary)from departments dleft join dept_emp de on de.dept_no = d.dept_noleft join salaries s on s.emp_no = de.emp_nogroup by d.dept_noorder by d.dept_no
解题思路:将departments和dept_emp联结(左联结内联结都可以),得到员工对应的部门编号和部门名称后,再联结salaries表,通过对部门分组,得到每组工资数。
SQL23 对所有员工的薪水按照salary降序进行1-N的排名
select emp_no, salary, dense_rank() over (order by salary desc) as 't_rank'from salariesorder by salary desc, emp_no asc
解题思路:使用别名rank时必须要用单引号或双引号,否则出错。
使用窗口函数DENSE_RANK() OVER()函数即可将实现薪水按照salary进行按照1-N的排名,相同salary并列。
https://blog.csdn.net/sb_jb/article/details/124208738
SQL24 获取所有非manager员工当前的薪水情况
select de.dept_no, de.emp_no, s.salaryfrom dept_emp de,salaries swhere de.emp_no = s.emp_noand s.emp_no not in( select emp_no from dept_manager)
select de.dept_no, de.emp_no, s.salaryfrom dept_emp dejoin dept_manager dm on de.dept_no = dm.dept_nojoin salaries s on de.emp_no = s.emp_nowhere de.emp_no != dm.emp_no
SQL25 获取员工其当前的薪水比其manager当前薪水还高的相关信息
select emp.emp_no, manager.emp_no, emp.salary, manager.salary from (select de.dept_no as dept_no, de.emp_no as emp_no, s.salary as salary from dept_emp de join salaries s on de.emp_no = s.emp_no ) as emp join (select dm.dept_no as dept_no, dm.emp_no as emp_no, s.salary as salary from dept_manager dm join salaries s on dm.emp_no = s.emp_no) as manager on emp.dept_no=manager.dept_no where emp.emp_no<>manager.emp_no and emp.salary > manager.salary
解题思路:分别选出员工表和管理者表,然后通过部门号结合,按照员工表中的工资高于管理者表中的工资进行筛选,得出结果