SQL刪除重復的電子郵箱力扣題目解答流程

寫在前面

想要掌握好SQL,那少不瞭每天的練習與學習。接下來小夢會帶領小夥伴們一起每天刷一道LeetCode-數據庫(SQL)相關的題目,然後在文章後例舉相關知識點幫助小夥伴們學習與鞏固,更好的掌握SQL。

🙋‍♂️ 小夥伴們如果在學習過程中有不明白的地方,歡迎評論區留言提問,小夢定知無不言,言無不盡。

SQL題目概述

題目:

編寫一個 SQL 查詢,來刪除 Person 表中所有重復的電子郵箱,重復的郵箱裡隻保留 Id 最小 的那個。

LeetCode原題連接

https://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
 

代碼測試

進行代碼測試

 與預期結果一致,測試成功,用時166ms

知識點小結

 ⭐內連接與外連接⭐

小夢用極簡單的方式帶小夥伴們過一遍內連接與外連接。

 表1 classa             

表2 classb

1. 內連接 inner join (join 默認就是內連接)

表1與表2的交集,用上面兩個表演示一下

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

 查詢的結果是classa與classb的交集

2. 左外連接 left join

結果集保留左表的所有行,但右表隻包含與左表匹配的行。右表相應的空行為NULL值。

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

3. 右外連接 right join

結果集保留右表的所有行,但左表隻包含與右表匹配的行。左表相應的空行為NULL值。

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

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;

到此這篇關於SQL刪除重復的電子郵箱解答流程的文章就介紹到這瞭,更多相關SQL 刪除重復郵箱內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: