方法1
思路
通过将表 employees 和表 salaries 内连接查询就可得到输出样例中的结果,重点在于如何在不通过 order by 排序的情况下得到薪水第二多的员工记录
步骤 1
先找出 salaries 表中薪水最多的记录
select max(salary) max_salary from salaries;
步骤 2
在 where 条件中过滤掉步骤 1 中得到的薪水最多的记录,并重复 1 次步骤 1,这样就能得到薪水第二多的记录
select max(salary) secondary_salary from salaries where salary != (select max(salary) max_salary from salaries);
步骤 3
将表 employees 和表 salaries 进行联合查询,并且将薪水第二多的薪水作为过滤条件
select b.emp_no,
b.salary,
a.last_name,
a.first_name
from employees a inner join
salaries b on a.emp_no = b.emp_no
where b.salary in (select max(salary) max_ssecondary_salaryalary_2
from salaries
where salary != (select max(salary) max_salary from salaries)
) 方法2
思路
将表 salaries 与表 salaries 进行笛卡尔连接,并以薪水作为过滤条件来得到每个员工从高到低的薪水排名
步骤 1
将表 salaries 与表 salaries 进行笛卡尔连接,并以薪水作为过滤条件,按员工来聚合查询得到每个员工从高到低的薪水排名,以及
select b.emp_no,
b.salary,
c.emp_no,
c.salary
from salaries b cross join
salaries c on b.salary <= c.max_salar
order by b.emp_no, c.emp_no;+--------+--------+--------+--------+ | emp_no | salary | emp_no | salary | +--------+--------+--------+--------+ | 10001 | 88958 | 10001 | 88958 | | 10002 | 72527 | 10001 | 88958 | | 10002 | 72527 | 10002 | 72527 | | 10002 | 72527 | 10004 | 74057 | | 10003 | 43311 | 10001 | 88958 | | 10003 | 43311 | 10002 | 72527 | | 10003 | 43311 | 10003 | 43311 | | 10003 | 43311 | 10004 | 74057 | | 10004 | 74057 | 10001 | 88958 | | 10004 | 74057 | 10004 | 74057 | +--------+--------+--------+--------+
对员工编号进行分组查询得到大于等于其薪水的员工数,也是薪水排名
select b.emp_no,
max(b.salary) salary,
count(*) rank_salary_desc
from salaries b cross join
salaries c on b.salary <= c.salary
group by b.emp_no; +--------+--------+------------------+ | emp_no | salary | rank_salary_desc | +--------+--------+------------------+ | 10001 | 88958 | 1 | | 10002 | 72527 | 3 | | 10003 | 43311 | 4 | | 10004 | 74057 | 2 | +--------+--------+------------------+
步骤 2
得到薪水第二多的员工编号及薪水
select b.emp_no,
max(b.salary) salary,
count(*) rank_salary_desc
from salaries b cross join
salaries c on b.salary <= c.salary
group by b.emp_no
having rank_salary_desc = 2;+--------+--------+------------------+ | emp_no | salary | rank_salary_desc | +--------+--------+------------------+ | 10004 | 74057 | 2 | +--------+--------+------------------+
步骤 3
将步骤 2 中得到的薪水第二多的记录与员工信息表 employees 进行内连接以获取员工姓名信息
select d.emp_no,
d.salary,
a.last_name,
a.first_name
from employees a inner join
(select b.emp_no,
max(b.salary) salary,
count(*) rank_salary_desc
from salaries b cross join
salaries c on b.salary <= c.salary
group by b.emp_no
having rank_salary_desc = 2
) d on a.emp_no = d.emp_no; +--------+--------+-----------+------------+ | emp_no | salary | last_name | first_name | +--------+--------+-----------+------------+ | 10004 | 74057 | Koblick | Chirstian | +--------+--------+-----------+------------+

京公网安备 11010502036488号