[牛客网数据库SQL实战] 第二题 的一些想法
题目描述
查找入职员工时间排名倒数第三的员工所有信息
表结构如下:
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`));
题目很简单,但是有一些值得学习深思的地方。
因为SQLSERVER 接触的比较多,这题我是用ROW_NUMBER()函数来做的,代码如下:
;with CTE as
(
select *,ROW_NUMBER() as number from employees order by hire_date desc
)
select emp_no ,birth_date ,first_name ,last_name ,gender ,hire_date where number = 3
后来我去看了别人的一些代码,如下:
select * from employees order by hire_date desc limit 2,1;
一看,好简单,一共一句话。不过这个limit2,1 是什么呢?我咋没听说过呢?
百度了一下,这个limit是MYSQL里面的写法(Mysql接触的少),SQLSERVER和Orcale都不支持这种写法。
LIMIT m,n : 表示从第m+1条开始,取n条数据;
LIMIT n : 表示从第0条开始,取n条数据,是limit(0,n)的缩写。
那么这里Limit 2,1 的意思就是从第三条开始取数,取一条。
在SQLSERVER中只有top关键字可以查前n条的内容,不过是从第一条开始一直到第n条,而不能做类似于取第3条数据,取第7至第9条数据。
于是,有人利用TOP关键字仿写出limit表达式的效果,取第m条到第n条记录,如下:
select top (n-m+1) id from tablename
where id not in (
select top m-1 id from tablename
)
然后下面还看到一些比较细心的同学提出:入职员工排名倒数第三的员工可能不止一位,代码应该改成:
SELECT * FROM employees WHERE
hire_date = (SELECT distinct hire_date FROM employees ORDER BY hire_date DESC LIMIT 2,1);
这个distinct可以说是用的很精髓了。
虽然只是很简单的一道题,但是也能给我们这么多的思考,可以说学问无处不在,只要我们肯钻研,一定可以有更长远的进步。
下一篇: MySQL PDO连接与操作