[牛客网数据库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可以说是用的很精髓了。

 

虽然只是很简单的一道题,但是也能给我们这么多的思考,可以说学问无处不在,只要我们肯钻研,一定可以有更长远的进步。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值