题目描述
有一个员工 employees 表简况如下:
建表语句如下:
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
请你查找 employees 表中,入职员工时间排名倒数第三的员工所有信息,上述示例输出如下:
答案解析
思路一
使用 ORDER BY DESC 将 hire_date 列按照降序对查询的结果集进行排序,并取出倒数第三的结果返回。
如果要取出倒数第三的结果,我们可以使用 LIMIT 语句或 LIMIT OFFSET 语句
回顾下 LIMIT 语句的用法
语法一:
LIMIT m,n;
m 表示偏移量,从 0 开始;n 表示取出多少条记录
语法二:
LIMIT n;
表示从头开始,取出 n 条记录
LIMIT 和 OFFSET 语句搭配使用也可以完成这样的功能
LIMIT m OFFSET n;
OFFSET 后面是偏移量,LIMIT 后面为取出记录的个数
SQL 语句如下:
SELECT * FROM employees
ORDER BY hire_date DESC
LIMIT 2,1;
或者可以使用LIMIT 和 OFFSET 语句:
SELECT * FROM employees
ORDER BY hire_date DESC
LIMIT 1 OFFSET 2;
不过思路一答案查询到的结果仅适用在一个前提下:数据表里所有的员工入职日期均不是同一天!如果违背了该前提,那么查询到的结果就有可能是错误的。
思路二
我们可以使用子查询。
首先,我们需要查询入职日期为第三晚的日期为多少;然后将结果作为子查询条件,查询出入职日期为第三晚的所有员工。
查询入职第三晚的日期,该查询需要使用 DISTINCT 语句
DISTINCT 用法:
关键字 DISTINCT 用于返回唯一不同的值
语法:
SELECT DISTINCT 列名称 FROM 表名称
示例:
Orders 表如下
Company | OrderNumber |
---|---|
IBM | 1235 |
Apple | 1236 |
Intel | 1237 |
Apple | 1238 |
如果我们要从 Orders 表中获取 Company 列唯一不同的值
SQL 语句如下:
SELECT DISTINCT Company FROM Orders;
返回结果如下:
Company |
---|
IBM |
Apple |
Intel |
了解 DISTINCT 后,该查询语句就非常简单了。
SQL 语句如下:
SELECT * FROM employees
where hire_date = (
SELECT DISTINCT hire_date FROM employees
ORDER BY hire_date DESC
LIMIT 1 OFFSET 2
);