leetcode之sql刷题笔记

引言

感觉自己的sql水平很菜,可能是很久没用忘了,也可能是我当初就没学好,所以现在准备补习一波sql语句,在上一篇中,我列举了mysql基本的查询操作。另外买了本《高性能mysql》影印版还没到,《sql必知必会》今天看电子版想睡觉。。嗯,感觉效率不高,那么就开始刷题吧。


1. 组合两个表

题目来源:https://leetcode-cn.com/problems/combine-two-tables/


解答1:

# Write your MySQL query statement below
select a.FirstName,a.LastName,b.City,b.State from Person a,Address b where a.PersonId = b.PersonId;

然后提交后发现有问题,题目的满足条件是无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息。内连接的话只能是查询出来了他们的交集,而这里的意思,应该说的是外连接,所以正确的代码如下:

select a.FirstName,a.LastName,b.City,b.State from Person a left join Address b on a.PersonId = b.PersonId;

2. 第二高的薪水

题目来源:https://leetcode-cn.com/problems/second-highest-salary/

刷这题就开始深深感觉到了自己sql的弱势,敲得太少了,脑子里的思路都是杂乱无章,然后我去找了一篇列举了很多种方式解决该问题的博文,为 mysql |那些关于第二大的事,然后大概懂了什么思路,写了一下子查询。

SELECT
    (SELECT DISTINCT
            Salary
        FROM
            Employee
        ORDER BY Salary DESC
        LIMIT 1 OFFSET 1) AS SecondHighestSalary;

limit中第一个数表示检索记录行,第二个数offset为偏移量。然后我们可以用IFNULL补足题目要求的为空那么就返回空值NULL。这里不再赘述,还有一种思想是既然是取第二大,那么可以从中取巧,排除最大的集合里再选择最大,所以,SQL语句为:

SELECT MAX(Salary) AS SecondHighestSalary
     FROM Employee 
         WHERE Salary < (SELECT MAX(Salary) FROM Employee)

3. 第N高的薪水

题目链接:https://leetcode-cn.com/problems/nth-highest-salary

依照上面的方法,第二种算是取巧,无法复制。所以类似于第一种的排序去重,limit取其次,语句为:

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
DECLARE M INT;
SET M=N-1;
  RETURN (
      # Write your MySQL query statement below.
      SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT M, 1
  );
END

嗯,暂时还写不出来,不过《高性能mysql》已到。

4. 查找重复的电子邮箱

题目链接:https://leetcode-cn.com/problems/duplicate-emails/

经历了上一题的懵逼,本题思路毫无桎梏的解决,这里需要注意的问题是,having条件一般和group by连用,where是固定表,而它相当于临时表。

select Email
from Person
group by Email
having count(Email) > 1;

5. 连续出现的数字

后面题目我的刷题链接: https://blog.csdn.net/submarineas/article/details/98487338

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

submarineas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值