Leetcode 之 Mysql(day01)

  大四已经接近一半了,下学期就要准备找工做实习了。为了本身能找到一份比较满意的实习,今天开始要刷一下题目。今天就刷 MySQL 语言。如下就是我今天刷的题目。你们也能够去 leetcode 注册一个帐号来刷一下题目。里面有不少的算法题。算法

 

第一题:编写一个 SQL 查询,知足条件:不管 person 是否有地址信息,都须要基于上述两表提供 person 的如下信息:FirstName, LastName, City, State

表1: Person

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

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

express

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                 |
+---------------------+

spa

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

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

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

  表达式:IFNULL(expression, alt_value)。排序

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

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

 

第三题:编写一个 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

相关文章
相关标签/搜索