题目描述

有一个员工 employees 表简况如下:

查找入职员工时间排名倒数第三的员工所有信息 - 图1

建表语句如下:

  1. CREATE TABLE `employees` (
  2. `emp_no` int(11) NOT NULL,
  3. `birth_date` date NOT NULL,
  4. `first_name` varchar(14) NOT NULL,
  5. `last_name` varchar(16) NOT NULL,
  6. `gender` char(1) NOT NULL,
  7. `hire_date` date NOT NULL,
  8. PRIMARY KEY (`emp_no`));

请你查找 employees 表中,入职员工时间排名倒数第三的员工所有信息,上述示例输出如下:

查找入职员工时间排名倒数第三的员工所有信息 - 图2

答案解析

思路一

使用 ORDER BY DESC hire_date 列按照降序对查询的结果集进行排序,并取出倒数第三的结果返回。

如果要取出倒数第三的结果,我们可以使用 LIMIT 语句或 LIMIT OFFSET 语句

回顾下 LIMIT 语句的用法

语法一:

  1. LIMIT m,n;

m 表示偏移量,从 0 开始;n 表示取出多少条记录

语法二:

  1. LIMIT n;

表示从头开始,取出 n 条记录

LIMIT OFFSET 语句搭配使用也可以完成这样的功能

  1. LIMIT m OFFSET n;

OFFSET 后面是偏移量,LIMIT 后面为取出记录的个数

SQL 语句如下:

  1. SELECT * FROM employees
  2. ORDER BY hire_date DESC
  3. LIMIT 2,1;

或者可以使用LIMIT OFFSET 语句:

  1. SELECT * FROM employees
  2. ORDER BY hire_date DESC
  3. LIMIT 1 OFFSET 2;

不过思路一答案查询到的结果仅适用在一个前提下:数据表里所有的员工入职日期均不是同一天!如果违背了该前提,那么查询到的结果就有可能是错误的。

思路二

我们可以使用子查询。

首先,我们需要查询入职日期为第三晚的日期为多少;然后将结果作为子查询条件,查询出入职日期为第三晚的所有员工。

查询入职第三晚的日期,该查询需要使用 DISTINCT 语句

DISTINCT 用法:

关键字 DISTINCT 用于返回唯一不同的值

语法:

  1. SELECT DISTINCT 列名称 FROM 表名称

示例:

Orders 表如下

Company OrderNumber
IBM 1235
Apple 1236
Intel 1237
Apple 1238

如果我们要从 Orders 表中获取 Company 列唯一不同的值

SQL 语句如下:

  1. SELECT DISTINCT Company FROM Orders;

返回结果如下:

Company
IBM
Apple
Intel

了解 DISTINCT 后,该查询语句就非常简单了。

SQL 语句如下:

  1. SELECT * FROM employees
  2. where hire_date = (
  3. SELECT DISTINCT hire_date FROM employees
  4. ORDER BY hire_date DESC
  5. LIMIT 1 OFFSET 2
  6. );