【leetcode两题选手】MySQL类题目(六)

时间:2022-07-23
本文章向大家介绍【leetcode两题选手】MySQL类题目(六),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题一:删除重复的电子邮箱

编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+

Id 是这个表的主键。 例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+

提示:

执行 SQL 之后,输出是整个 Person 表。 使用 delete 语句。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/delete-duplicate-emails 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

delete p1 from
Person p1,Person p2
where(
    p1.Email = p2.Email 
    and
    p1.Id>p2.Id
);

终于有能自己写的题目了。

收获

使用 DELETE 和 WHERE 子句

我们可以使用以下代码,将此表与它自身在电子邮箱列中连接起来。 然后我们需要找到其他记录中具有相同电子邮件地址的更大 ID。所以我们可以像这样给 WHERE 子句添加一个新的条件。 因为我们已经得到了要删除的记录,所以我们最终可以将该语句更改为 DELETE。

其实重要的是,我学会了这种写法:

delete p1 from
Person p1,Person p2

在实际生产中,面对千万上亿级别的数据,连接的效率往往最高,因为用到索引的概率较高。

题二:上升的温度

给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。

+---------+------------------+------------------+
| Id(INT) | RecordDate(DATE) | Temperature(INT) |
+---------+------------------+------------------+
|       1 |       2015-01-01 |               10 |
|       2 |       2015-01-02 |               25 |
|       3 |       2015-01-03 |               20 |
|       4 |       2015-01-04 |               30 |
+---------+------------------+------------------+

例如,根据上述给定的 Weather 表格,返回如下 Id:

+----+
| Id |
+----+
|  2 |
|  4 |
+----+

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/rising-temperature 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

SELECT w2.Id
FROM Weather w1, Weather w2
WHERE DATEDIFF(w2.RecordDate, w1.RecordDate) = 1
AND w1.Temperature < w2.Temperature

收获

其实思路很明确,就是输在了那个日期判断的函数上,我的函数是这样的:

-- select W1.Id from
-- Weather W1,Weather W2
-- where(
--     W1.RecordDate = W2.RecordDate+1
--     and
--     W1.Temperature > W2.Temperature
-- );