题目描述
有一个员工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里最晚入职员工的所有信息,以上例子输出如下:
题解
方法一:子查询
按理来说这个解法才是正解,因为最后一天不一定只有一个员工入职,也有可能多个员工同时在这一天入职。但其实题目说的模棱两可,貌似只考虑了最后一天只有一个员工的情况。
select * from employees where hire_date = (select max(hire_date) from employees);
运行时间:40ms
超过25.63%用Mysql提交的代码占用内存:5944KB
超过1.95%用Mysql提交的代码
方法二:使用limit关键字
对入职时间降序排序后直接使用limit
关键字即可。
select * from employees order by hire_date desc limit 1;
运行时间:40ms
超过25.63%用Mysql提交的代码占用内存:5368KB
超过20.71%用Mysql提交的代码
可以看出占用内存略小于子查询的写法,一般情况下优先使用关键字。
limit函数复习
mysql里分页一般用limit
来实现,类似SQLserver中top
的用法。
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset;
limit | 作用 |
---|---|
limit(n) | 取前n条记录 |
limit(m, n) | 从第 m + 1 行开始取 n 条记录,n也可为负数 |
limit n offset m | 效果同上 |
复习过后,我们尝试用两种写法再次将这个算法实现一下(效率同上)。
-- 使用limit 与 offset关键字
select * from employees
order by hire_date desc
limit 1 offset 0;
-- 仅使用limit关键字
select * from employees
order by hire_date desc
limit 0,1;