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

你可能感兴趣的:(mysql)