【LeetCode-SQL每日一练】—— 196. 删除重复的电子邮箱

写在前面

‍♂️大家好呀,我是超梦。大家可以叫我小梦~

小伙伴们都知道,不管是在学习中还是日常工作中,几乎天天是要跟数据库打交道的,为了更好的操作数据库,我们的SQL知识储备是必不可少的。想要掌握好SQL,那少不了每天的练习与学习。接下来小梦会带领小伙伴们一起每天刷一道LeetCode-数据库(SQL)相关的题目,然后在文章后例举相关知识点帮助小伙伴们学习与巩固,更好的掌握SQL。

‍♂️ 小伙伴们如果在学习过程中有不明白的地方,欢迎评论区留言提问,小梦定知无不言,言无不尽。


目录

写在前面

⭐SQL题目概述⭐

⭐解题思路⭐

⭐方法实现⭐

⭐代码测试⭐

⭐知识点小结⭐


⭐SQL题目概述⭐

题目:

编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。LeetCode原题连接icon-default.png?t=M0H8https://leetcode-cn.com/problems/delete-duplicate-emails/

Person 表

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | [email protected] |
| 2  | [email protected]  |
| 3  | [email protected] |
+----+------------------+

Id 是这个表的主键。


⭐解题思路⭐

  • 通过自连接将此表与它自身连接起来,通过电子邮箱列。
  • 然后我们需要找到其他记录中具有相同电子邮件地址的更大 ID。所以我们通过ID作比较找出大的数据,把这个作为条件添加到WHERE子句中。
  • 因为我们已经得到了要删除的记录,然后我们使用DELETE语句实现。

⭐方法实现⭐

根据以上解题思路,我们可以很容易写出题解

DELETE 
    pson1
FROM 
    Person pson1,Person pson2
WHERE 
    pson1.Email = pson2.Email AND pson1.Id > pson2.Id


⭐代码测试⭐

进行代码测试

【LeetCode-SQL每日一练】—— 196. 删除重复的电子邮箱_第1张图片

 与预期结果一致,测试成功,用时166ms

【LeetCode-SQL每日一练】—— 196. 删除重复的电子邮箱_第2张图片


⭐知识点小结⭐

 内连接与外连接

小梦用极简单的方式带小伙伴们过一遍内连接外连接

 表1 classa             

         

表2 classb

1. 内连接 inner joinjoin 默认就是内连接

表1与表2的交集,用上面两个表演示一下

select 
    classa.id as aid,classb.id as bid 
from 
    classa 
inner join classb on classa.id = classb.id;

 查询的结果是classa与classb的交集【LeetCode-SQL每日一练】—— 196. 删除重复的电子邮箱_第3张图片

 2. 左外连接 left join

结果集保留左表的所有行,但右表只包含与左表匹配的行。右表相应的空行为NULL值。

select 
    classa.id as aid,classb.id as bid 
from 
    classa 
left join classb on classa.id = classb.id;

【LeetCode-SQL每日一练】—— 196. 删除重复的电子邮箱_第4张图片

  3. 右外连接 right join

结果集保留右表的所有行,但左表只包含与右表匹配的行。左表相应的空行为NULL值。

select 
    classa.id as aid,classb.id as bid 
from 
    classa 
right join classb on classa.id = classb.id;

【LeetCode-SQL每日一练】—— 196. 删除重复的电子邮箱_第5张图片

 4. 全外连接 full join

会把两个表所有的行都显示在结果表中。

select 
    classa.id as aid,classb.id as bid 
from 
    classa 
full join classb on classa.id = classb.id;

小伙伴们注意啦!!!

MySQL不支持full join!!!MySQL不支持full join!!!MySQL不支持full join!!!

重要的事情要说三遍!!!那怎么实现和full join一样的效果呢?那就要通过使用union来实现,具体实现SQL语句如下

select 
    classa.id as aid,classb.id as bid 
from 
    classa left join classb on classa.id = classb.id
union
select 
    classa.id as aid,classb.id as bid 
from 
   classa right join classb on classa.id = classb.id;

【LeetCode-SQL每日一练】—— 196. 删除重复的电子邮箱_第6张图片


这篇文章如果对小伙伴们有帮助的话,希望点个赞支持一下~      十分感谢~

【LeetCode-SQL每日一练】—— 196. 删除重复的电子邮箱_第7张图片


你可能感兴趣的:(sql,leetcode,数据库)