力扣(LeetCode)
1、编写一个 SQL 查询,查找所有至少连续出现三次的数字。
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/consecutive-numbers
SELECT DISTINCT
s.Num AS ConsecutiveNums
FROM
LOGS s
JOIN LOGS b ON (
s.Num = b.Num
AND b.Id >= s.Id - 2
AND b.Id <= s.Id )
GROUP BY
s.Id
HAVING
count( * ) >=3
1)首先进行了双表连接,双表连接的条件是:id值的相差范围是0到2,而且Num相同;
2)然后从join表中选择出Num和Num出现的次数;
3)最后外层查询再从中选择出次数大于等于3的Num;
内查询用的是group by a.id,这里不好理解:
双表连接之后,会出现大量重复的元组,比如(分别表示a表的id,b表的id,Num):
(1,1,1)(1,2,1)(1,3,1)
(2,1,1)(2,2,1)(2,3,1)
(3,1,1)(3,2,1)(3,3,1)
所以,这里group by(a.id)是非常合理的。
2、
Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。
+----+-------+--------+-----------+
| Id | Name | Salary | ManagerId |
+----+-------+--------+-----------+
| 1 | Joe | 70000 | 3 |
| 2 | Henry | 80000 | 4 |
| 3 | Sam | 60000 | NULL |
| 4 | Max | 90000 | NULL |
+----+-------+--------+-----------+
给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。
+----------+
| Employee |
+----------+
| Joe |
+----------+
SELECT
s.NAME
FROM
Employee as s
WHERE
Salary > ( SELECT Salary FROM Employee WHERE Id = s.ManagerId )
1、首先判断出员工的id和管理员ManagerId,
2、通过子查询判断出在员工的id和管理员ManagerId相等的情况下,员工的收入高于管理员的收入
总结:题目比较简短,注意理解题意