Test 1
有一个薪水表 salaries
简况如下:
请你获取薪水第二多的员工的 emp_no
以及其对应的薪水 salary
。
考察知识点
INNER JOIN
,ORDER BY
,FROM
中嵌套查询结果。
解题思路
:one: 先获取第二高薪水
SELECT DISTINCT(s2.salary) FROM salaries AS s2 ORDER BY s2.salary DESC LIMIT 1, 1 复制代码
:two: 再查找薪资与第二高薪水相等的员工相关信息。
SELECT emp_no, s1.salary FROM salaries AS s1 WHERE s1.salary = (SELECT DISTINCT(s2.salary) FROM salaries AS s2 ORDER BY s2.salary DESC LIMIT 1, 1) 复制代码
Test 2
有一个员工表 employees
简况如下:
有一个薪水表 salaries
简况如下:
请你查找薪水排名第二多的员工编号 emp_no
、薪水 salary
、last_name
以及 first_name
,不能使用 order by
完成,以上例子输出为:(温馨提示: sqlite
通过的代码不一定能通过 mysql
,因为 SQL
语法规定,使用聚合函数时,select
子句中一般只能存在以下三种元素:常数、聚合函数,group by
指定的列名。如果使用非 group by
的列名,sqlite
的结果和 mysql
可能不一样)
考察知识点
INNER JOIN
,MAX
,子查询。
解题思路
先利用 MAX()
函数找出 salaries
中当前薪水最高者,再找出小于最高薪水的 MAX(salary)
,即为第二高薪水。然后在内连接而成的表中根据题中条件筛选即可。
SELECT e.emp_no, salary, last_name, first_name FROM employees AS e INNER JOIN salaries AS s ON e.emp_no = s.emp_no AND s.salary = (SELECT max(salary) FROM salaries WHERE salary < (SELECT MAX(salary) FROM salaries))