方法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  |
+--------+--------+-----------+------------+