sql复习强化每日五题——第一天

 Person
+-------------+---------+
| 列名         | 类型     |
+-------------+---------+
| PersonId    | int     | 主键
| FirstName   | varchar |
| LastName    | varchar |
+-------------+---------+

Address
+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| AddressId   | int     | 主键
| PersonId    | int     |
| City        | varchar |
| State       | varchar |
+-------------+---------+

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

答案:
select FirstName,LastName,City,State from 
Person left join Address on Person.PersonId=Address.PersonId;
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。

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

答案
select FirstName,LastName,City,State from 
Person left join Address on Person.PersonId=Address.PersonId;
编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+
例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。如果不存在第 n 高的薪水,那么查询应返回 null。

+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200                    |
+------------------------+

答案
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  set N = N - 1;
  RETURN (
     select ifnull((select distinct Salary from Employee
     order by Salary DESC limit 1 offset N),null) as NthHighestSalary
  );
END
编写一个 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,dense_rank() over(order by Score DESC) as 'Rank' from Scores;
编写一个 SQL 查询,查找所有至少连续出现三次的数字。

+----+-----+
| Id | Num |
+----+-----+
| 1  |  1  |
| 2  |  1  |
| 3  |  1  |
| 4  |  2  |
| 5  |  1  |
| 6  |  2  |
| 7  |  2  |
+----+-----+
例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。

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

答案
select distinct Num as ConsecutiveNums
from(
    select Num,
    case 
        when @current = Num then @count:=@count+1
        when (@current := Num) then @count := 1
    end c_number
    from Logs,(select @current := 0,@count := 0) as t
    -- where c_number>=3
) as newLogs where newLogs.c_number>=3
此处where条件不能写在子查询内,会报出找不到c_number这个别名的错误,
尝试过Logs.c_number和t.c_number。不知道原因。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。