SQL刪除重復(fù)的電子郵箱力扣題目解答流程
寫在前面
想要掌握好SQL,那少不了每天的練習(xí)與學(xué)習(xí)。接下來小夢(mèng)會(huì)帶領(lǐng)小伙伴們一起每天刷一道LeetCode-數(shù)據(jù)庫(SQL)相關(guān)的題目,然后在文章后例舉相關(guān)知識(shí)點(diǎn)幫助小伙伴們學(xué)習(xí)與鞏固,更好的掌握SQL。
??♂? 小伙伴們?nèi)绻趯W(xué)習(xí)過程中有不明白的地方,歡迎評(píng)論區(qū)留言提問,小夢(mèng)定知無不言,言無不盡。
SQL題目概述
題目:
編寫一個(gè) SQL 查詢,來刪除 Person
表中所有重復(fù)的電子郵箱,重復(fù)的郵箱里只保留 Id 最小 的那個(gè)。
LeetCode原題連接
https://leetcode-cn.com/problems/delete-duplicate-emails/
Person 表
+----+------------------+
| Id | Email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
| 3 | john@example.com |
+----+------------------+
Id 是這個(gè)表的主鍵。
解題思路
- 通過 自連接 將此表與它自身連接起來,通過電子郵箱列。
- 然后我們需要找到其他記錄中具有相同電子郵件地址的更大 ID。所以我們通過ID作比較找出大的數(shù)據(jù),把這個(gè)作為條件添加到WHERE子句中。
- 因?yàn)槲覀円呀?jīng)得到了要?jiǎng)h除的記錄,然后我們使用DELETE語句實(shí)現(xiàn)。
方法實(shí)現(xiàn)
根據(jù)以上解題思路,我們可以很容易寫出題解。
DELETE pson1 FROM Person pson1,Person pson2 WHERE pson1.Email = pson2.Email AND pson1.Id > pson2.Id
代碼測(cè)試
進(jìn)行代碼測(cè)試
與預(yù)期結(jié)果一致,測(cè)試成功,用時(shí)166ms
知識(shí)點(diǎn)小結(jié)
?內(nèi)連接與外連接?
小夢(mèng)用極簡(jiǎn)單的方式帶小伙伴們過一遍內(nèi)連接與外連接。
表1 classa
表2 classb
1. 內(nèi)連接 inner join (join 默認(rèn)就是內(nèi)連接)
表1與表2的交集,用上面兩個(gè)表演示一下
select classa.id as aid,classb.id as bid from classa inner join classb on classa.id = classb.id;
查詢的結(jié)果是classa與classb的交集
2. 左外連接 left join
結(jié)果集保留左表的所有行,但右表只包含與左表匹配的行。右表相應(yīng)的空行為NULL值。
select classa.id as aid,classb.id as bid from classa left join classb on classa.id = classb.id;
3. 右外連接 right join
結(jié)果集保留右表的所有行,但左表只包含與右表匹配的行。左表相應(yīng)的空行為NULL值。
select classa.id as aid,classb.id as bid from classa right join classb on classa.id = classb.id;
4. 全外連接 full join
會(huì)把兩個(gè)表所有的行都顯示在結(jié)果表中。
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?。。ySQL不支持full join?。?!
重要的事情要說三遍!??!那怎么實(shí)現(xiàn)和full join一樣的效果呢?那就要通過使用union來實(shí)現(xiàn),具體實(shí)現(xiàn)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;
到此這篇關(guān)于SQL刪除重復(fù)的電子郵箱解答流程的文章就介紹到這了,更多相關(guān)SQL 刪除重復(fù)郵箱內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQLServer 參數(shù)化查詢經(jīng)驗(yàn)分享
本篇文章將介紹參數(shù)化查詢。我將討論如果一個(gè)查詢可以被參數(shù)化,那么SQL Server優(yōu)化器怎樣嘗試將其參數(shù)化,以及你可以怎樣建立你自己的參數(shù)化查詢。2010-05-05Sql Server臨時(shí)表和游標(biāo)的使用小結(jié)
這篇文章主要介紹了Sql Server臨時(shí)表和游標(biāo)的使用小結(jié),需要的朋友可以參考下2017-05-05SQLSERVER語句的執(zhí)行時(shí)間顯示的統(tǒng)計(jì)結(jié)果是什么意思
在SQL語句調(diào)優(yōu)的時(shí)候,大部分都會(huì)查看語句執(zhí)行時(shí)間,究竟SQLSERVER顯示出來的統(tǒng)計(jì)結(jié)果是什么意思,接下來為您一一解釋,感興趣的朋友可以了解下2013-01-01SqlServer參數(shù)化查詢之where in和like實(shí)現(xiàn)詳解
若有一天你不可避免的需要提高SQL的查詢性能,需要一次性where in 幾百、上千、甚至上萬條數(shù)據(jù)時(shí),參數(shù)化查詢將是必然進(jìn)行的選擇2012-05-05sql server學(xué)習(xí)基礎(chǔ)之內(nèi)存初探
這篇文章主要給大家介紹了關(guān)于sql server中內(nèi)存的相關(guān)資料,文中通過圖文以及示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者理解sql server具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07按日期選擇最晚日期與最早日期對(duì)應(yīng)的數(shù)的差值
想得到當(dāng)天的最早時(shí)間與最晚時(shí)間的number的差值,需要的朋友可以參考下。2009-11-11通過T_sql語句向其中一次填入一條數(shù)據(jù)或一次填入多條數(shù)據(jù)的方式填充數(shù)據(jù)
使用T_sql語句向其中一次填入一條數(shù)據(jù)或一次填入多條數(shù)據(jù)的方式填入數(shù)據(jù),需要的朋友可以參考下2012-10-10解析Mybatis對(duì)sql表的一對(duì)多查詢問題
這篇文章主要介紹了解析Mybatis對(duì)sql表的一對(duì)多查詢,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06SQL?Server基礎(chǔ)教程之游標(biāo)(Cursor)
這篇文章主要給大家介紹了關(guān)于SQL?Server基礎(chǔ)教程之游標(biāo)(Cursor)的相關(guān)資料,游標(biāo)是SQL Server的一種數(shù)據(jù)訪問機(jī)制,它允許用戶訪問單獨(dú)的數(shù)據(jù)行,需要的朋友可以參考下2023-11-11