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。不知道原因。
网友评论