作为一个菜比,我开始挑战Leetcode

来源:互联网 发布:手机放电软件 编辑:程序博客网 时间:2024/05/22 06:42

2017/7/2 今天挑战了两道SQL相关的题


一个是很简单的两张表之间的关联查询 LEFT JOIN 就能搞定.

第二题也不算难,而且思路有多种

题目是这样的 :

+----+--------+| Id | Salary |+----+--------+| 1  | 100    || 2  | 200    || 3  | 300    |+----+--------+
求 : 排名第二的Salary 
排第一或者最后一名当然很简单啦,不过就是 max() 和 min() 吗,当然求倒数第二位没有这么简单了.稍微绕一点
思路很多 : 第一种 我用的oracle 写的 
select t.* from (SELECT MM."ID",Rank()Over(ORDER BY MM."ID" DESC) AS rank FROM M_TEAM MM) t WHERE rank<>1and ROWNUM <= 1
重点在 Rank()OVER() 思路,先排序,排序后去掉结果集中的第一名,再查询此时的第一名,当然就是第二名了
官网上点赞最多的答案 :
SELECT max(Salary)
FROM Employee
WHERE Salary < (SELECT max(Salary) FROM Employee)
非常简洁,效率应该比我那个要高点,很厉害
思路是一样的 
作者自己指出这样查的话如果表中的Salary有null的存在并且刚好是排第二的,那么,返回的结果将是 null
网友的魔改 : 
select IFNULL( (select distinct e1.salary from Employee e1
where (select count(distinct e2.salary ) from Employee e2 where e2.salary > e1.salary) = 1) , null)
啧啧,很厉害
今天就这样吧

原创粉丝点击