![b7fea38bbc5bd9c53c37f50eadb37abf.png](https://i-blog.csdnimg.cn/blog_migrate/60bb9338b08805d2378fd1d794a1e3e7.jpeg)
辣酱为了做数据分析而重启SQL之路,目前选取了牛客网进行编程练习。今天的练习是按照特定条件进行查找操作,涉及排序、子查询等。
题目描述
【题目来源牛客网】查找最晚入职员工的所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天。
![64f7ba30c3ad5b483f7f594163199679.png](https://i-blog.csdnimg.cn/blog_migrate/d1faa8c076aa27985aeaa8710f1fa998.jpeg)
题目与输出
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`));
解题思路
- 【看输出】查询的结果是员工的所有信息 所以用 * 进行查询;
- 【看约束条件】查询的目标员工是最晚入职的,所以翻译过来就是要找到hire_date最大的员工;
- 【看扩展条件】“目前所有的数据里员工入职的日期都不是同一天” 表明不存在多条返回记录。
![20d20d92d32d9593b3c3ca6be083fdc1.png](https://i-blog.csdnimg.cn/blog_migrate/2dc6712c7cc890d41bc6c93045ef1bff.jpeg)
提交并通过的代码
select * from employeeswhere hire_date in (select max(hire_date) from employees);
以上写法是通过子查询获取hire_date最大的员工集,然后通过where子句提取在该数据集的员工数据。这种写法的好处就是可以无视第三条扩展条件,无论是否有相同日期入职的员工都适用。
另一种写法是基于第三条扩展条件的理解,假设所有的员工入职日期都不相同。
第一步现将hire_date通过order by进行desc(降序)排序,第二步则使用limit取首条记录。
select * from employees order by hire_date desc limit 0,1;