题目描述
查找入职员工时间排名倒数第三的员工所有信息,为了减轻入门难度,目前所有的数据里员工入职的日期都不是同一天
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`));
在这里考虑数据库里员工入职的日期有多个同一天的可能性。
法1:运行时间14ms,占用内存4304kb
select * from employees where hire_date=(select distinct hire_date from employees order by hire_date desc limit 2,1);
法2:运行时间15ms,占用内存7320kb
select * from employees where hire_date=(select hire_date from employees group by hire_date order by hire_date desc limit 2,1);
distinct:用于去重,返回唯一不同的值
group by:根据一个列或多个列对结果集分组
order by:默认是对列升序排序,order by 列名 desc,是对列降序排序
limit:
以下的两种方式均表示取
2
,
3
,
4
三条条数据。
1
.select* from test LIMIT
1
,
3
;
当limit后面跟两个参数的时候,第一个数表示要跳过的数量,后一位表示要取的数量。
2
.select * from test LIMIT
3
OFFSET
1
;(在mysql
5
以后支持这种写法)
当 limit和offset组合使用的时候,limit后面只能有一个参数,表示要取的的数量,offset表示要跳过的数量 。
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15 //为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. //如果只给定一个参数,它表示返回最大的记录行数目: mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行 //换句话说,LIMIT n 等价于 LIMIT 0,n。