zoukankan      html  css  js  c++  java
  • Leetcode 之 Mysql(day01)

      大四已经接近一半了,下学期就要准备找工作实习了。为了自己能找到一份比较满意的实习,今天开始要刷一下题目。今天就刷 MySQL 语言。以下就是我今天刷的题目。大家也可以去 leetcode 注册一个账号来刷一下题目。里面有很多的算法题。

    第一题:编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:FirstName, LastName, City, State

    表1: Person

    +-------------+---------+
    | 列名         | 类型     |
    +-------------+---------+
    | PersonId    | int     |
    | FirstName   | varchar |
    | LastName    | varchar |
    +-------------+---------+
    PersonId 是上表主键

    表2: Address
    +-------------+---------+
    | 列名         | 类型    |
    +-------------+---------+
    | AddressId   | int     |
    | PersonId    | int     |
    | City        | varchar |
    | State       | varchar |
    +-------------+---------+
    AddressId 是上表主键

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

      第一题比较简单,考查我们对两个表的连接,并且对于左连接这个概念。

    第二题:编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。

    +----+--------+
    | Id | Salary |
    +----+--------+
    | 1  | 100    |
    | 2  | 200    |
    | 3  | 300    |
    +----+--------+

    例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。

    +---------------------+
    | SecondHighestSalary |
    +---------------------+
    | 200                 |
    +---------------------+

    select IFNULL(
        (select Salary from Employee 
         group by Salary 
         order by Salary desc 
         limit 1,1 ) , null) as SecondHighestSalary

      第二题难点在于找不到的时候怎样返回一个 null 值。我就运用了 IFNULL() 函数 。

      IFNULL() 函数:用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。

      表达式:IFNULL(expression, alt_value)。

      这样就很好解释第二题的 null 值了。这里还要掌握分组(group by) 和 排序(order by)。还有一个就是分页(limit)。

      这里就是通过工资分组,再排序,最后通过分页求出值。

    第三题:编写一个 SQL 查询,获取 Employee 表中第 高的薪水(Salary)。

    CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
    BEGIN
        SET N = N - 1;
      RETURN (
          select IFNULL(
              (select Salary from Employee
               group by Salary 
              order by Salary desc 
              limit N , 1) , null)
          as getNthHighestSalary
      );
    END

      这题在第二题基础上修改成查找第n高的薪水。

      这里用函数的写法来考查我们。在第二题的基础上注意N的变量就可以求出这题了。

    第四题:编写一个 SQL 查询来实现分数排名。如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

    +----+-------+
    | Id | Score |
    +----+-------+
    | 1  | 3.50  |
    | 2  | 3.65  |
    | 3  | 4.00  |
    | 4  | 3.85  |
    | 5  | 4.00  |
    | 6  | 3.65  |
    +----+-------+

    例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

    +-------+------+
    | Score | Rank |
    +-------+------+
    | 4.00  | 1    |
    | 4.00  | 1    |
    | 3.85  | 2    |
    | 3.65  | 3    |
    | 3.65  | 3    |
    | 3.50  | 4    |
    +-------+------+

    select Score , (select count(DISTINCT score) from Scores where score >= s.score) as Rank
    from Scores s order by Score desc

      此题难点在于怎样显示他们的排序。先统计有多少行,不能重复。

    第五题:编写一个 SQL 查询,查找所有至少连续出现三次的数字。

    +----+-----+
    | Id | Num |
    +----+-----+
    | 1  |  1  |
    | 2  |  1  |
    | 3  |  1  |
    | 4  |  2  |
    | 5  |  1  |
    | 6  |  2  |
    | 7  |  2  |
    +----+-----+

    例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。

    +-----------------+
    | ConsecutiveNums |
    +-----------------+
    | 1               |
    +-----------------+

    select distinct(a.Num) as ConsecutiveNums 
        from Logs a join Logs b on a.Id = b.Id+1 join Logs c on a.Id = c.Id + 2
        where a.Num = b.Num and a.Num = c.Num

      此题一定要注意题目是连续出现至少三次,要连续的。一开始我是直接统计出现的次数,再审题,发现不对。

      我就直接点,用表的自连接来解决这题。连接规则:根据id的连续三个以上来连接,再判断这三个值是否相等。

      这就是今天刷的题目,刚刚太久没有接触 sql 了,很多都不会写了。要经常锻炼才可以了。

      每天写一下博客,记录一下自己每天学到的知识。@HHH

  • 相关阅读:
    Github markdown页面内跳转
    github gist 无法访问
    Install pyaudio on Ubuntu
    删除链表的倒数第N个节点
    电话号码的字母组合
    最长公共前缀
    盛最多水的容器
    字符串转化整数与回文数
    Z 字形变换
    LeetCode1-5题
  • 原文地址:https://www.cnblogs.com/HHHY/p/11743921.html
Copyright © 2011-2022 走看看