Test 1
查找最晚入职员工的所有信息,有一个员工 employees
表简况如下:
请你查找 employees
里最晚入职员工的所有信息,以上例子输出如下:
考察知识点
ORDER BY
, LIMIT
,子查询。
LIMIT用法
首先我们要知道LIMIT
共两种常见用法:
SELECT * FROM table LIMIT [offset], rows -- LIMIT 单独使用 SELECT * FROM table LIMIT rows OFFSET [offset] -- 配合 OFFSET 使用 复制代码
offset:行开始的行的索引。0表示从第1行 开始显示(包括第1行),以此类推。
rows:数据显示的条数。
举几个栗子:
SELECT * FROM table1 LIMIT 5; //检索前5条数据(1-5) --相当于 SELECT * from table1 LIMIT 0,5; // 从第0行开始检索5条数据 --相当于 SELECT * FROM table1 LIMIT 5 OFFSET 0; //从第0行开始检索5条数据,注意这里的LIMIT的5指代的是数量 复制代码
解题思路
1️⃣ 如果只是按照题目的要求来做的话,因为数据里员工入职的日期都不是同一天,那么只需要对hire_date
列进行降序排列,取第一行数据即可。
SELECT * FROM employees ORDER BY hire_date DESC LIMIT 1; 复制代码
2️⃣ 上面的解法只能应用在日期都不是同一天的情况下,如果最晚入职的有很多人,那么数据必然不准确,因此,我们可以根据子查询来筛选hire_date
等于最晚日期的那些数据。
SELECT * FROM employees WHERE hire_date = (SELECT MAX(hire_date) FROM employees) 复制代码
Test 2
有一个员工 employees
表简况如下:
请你查找 employees
里入职员工时间排名倒数第三的员工所有信息,以上例子输出如下:
解题思路
考察知识点
DISTINCT
、LIMIT
、ORDER BY
、子查询。
1️⃣ 按照题目中的描述,员工入职日期都不是同一天,那么直接按照hire_date
列降序排列的结果,从第三行开始取出一行数据即可。
SELECT * FROM employees ORDER BY hire_date DESC LIMIT 2,1; 复制代码
2️⃣ 解法一有它的局限性,当员工的入职日期有重复时,获取的结果不一定是正确的。这时可以先筛选出入职时间第三晚的日期,然后找出日期等于该日期的员工信息。
SELECT * FROM employees WHERE hire_date = ( SELECT DISTINCT hire_date FROM employees ORDER BY hire_date DESC -- 倒序排列 LIMIT 1 OFFSET 2 -- 从索引2(第三行)开始取 );