【LeetCode-SQL每日一練】—— 182. 查找重復的電子郵箱

🎈寫在前面

  🙋‍♂️大傢好呀,我是超夢。小夥伴們都知道,不管是在學習中還是日常工作中,幾乎天天是要跟【數據庫】打交道的,為瞭更好的操作數據庫,我們的SQL【知識儲備】是必不可少的。想要掌握好SQL,那少不瞭每天的練習與學習。接下來小夢會帶領小夥伴們一起每天刷一道LeetCode-數據庫(SQL)相關的題目,然後在文章後例舉相關知識點幫助小夥伴們學習與鞏固,更好的掌握SQL。

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


目錄

🍕題目概述

🍕解題思路

🍟方法1

🍟方法2

🍟方法3

🍕代碼執行測試

🍟方法1

🍟方法2

🍟方法3

🍕知識點小結


🍕題目概述

題目:

編寫一個 SQL 查詢,查找 Person 表中所有重復的電子郵箱。

Person表

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

根據以上輸入,你的查詢應返回以下結果:

+---------+| Email   |+---------+| [email protected] |+---------+

🍕解題思路

        其實這道題很簡單啦,相信小夥伴們心中已經知道該怎麼做瞭,趕緊去LeetCode揮筆寫下答案測試一番吧!!測試完可以再看看小夢與大傢的思路是否一致呢,如果有多種思路,歡迎留言寫下你們的思路與解法,大傢互相學習學習~

        根據題意,要找出表中所有重復的電子郵箱,也就是Email字段對應的數據有重復的我需要查找出來。那我們可以使用count函數來獲取Email中各電子郵箱的數量,隻要數量大於1就是題目中要求的。接下來,根據該思路,小夢列出一下三種解法,小夥伴們如果有其它思路,歡迎補充~

🍟方法1

我們可以先查出Email和對應Email的個數,把查出的內容當作一個臨時表,在通過查該臨時表,找出Email數量大於的1的,這樣我們就查找出瞭題目所要求的【找出表中所有重復的電子郵箱】。

題解:

select Email from(select Email, count(Email) as num from Person group by Email) as temporarywhere num > 1;

🍟方法2

我們可以通過group by對Email進行分組,然後通過having進行條件篩查,having後面可以運用聚合函數非常方便(知識點小結部分會有group by與having的簡單講解,小夥伴們記得查閱哦~)。通過聚合函數count(Email)在having後進行條件篩查,找出Email個數大於1的,這樣我們就查找出瞭題目所要求的【找出表中所有重復的電子郵箱】。

題解:

select Email from Person group by Email having count(Email) > 1;

🍟方法3

第三種方法大傢可以發散一下思維,如果不用count函數怎麼知道重復的Email呢?怎麼查呢?小夢來帶小夥伴們一起思考,首先我們可以想想,前兩種方法實質上都是通過查出Email數判斷是否大於1,大於1就是我們所要的答案,不大1就不是。那大傢有沒有註意表Person雖然Email有重復的,但是id是唯一的,那我們就可以把Person表看成兩張表,一張a表和一張b表。連接兩張表,where語句後面加上a表的Email等於b表的Email和a表的id不等於b表的id。然後查詢Email做去重操作,就得到瞭我們想要的答案。

題解:

select distinct  a.Email from Person a,Person b where a.Email = b.Email and a.id  b.id;

🍕代碼執行測試 🍟方法1

select Email from(select Email, count(Email) as num from Person group by Email) as temporarywhere num > 1;

輸入題解,進行測試

 測試成功!

🍟方法2

select Email from Person group by Email having count(Email) > 1;

輸入題解,進行測試

 測試成功!

🍟方法3

select distinct  a.Email from Person a,Person b where a.Email = b.Email and a.id  b.id;

輸入題解,進行測試

測試成功!


🍕知識點小結

通過今天這一道題,小夢覺得有個知識點是需要簡單分享一下的,那就是gruop by子句和having子句。group by與having的語法什麼的小夢在這裡就不一一細說瞭,小夢簡單說一下group by與having在使用時一些需要註意的地方,希望小夥伴們用心記下來,絕對有用!

GROUP BY(數據分組)與HAVING子句

SQL中的數據可以按列名分組,可以搭配聚合函數一起使用,方便我們對於數據的查詢與獲取。

例:

SELECT count(stuname) FROM student GROUP BY student_class;

使用GROUP BY分組語句可以與WHERE語句一起使用,當然這裡有個非常重要的地方希望小夥伴們記下來,非常重要!->當一條SQL中有聚合函數,WHERE語句,GRUOP BY語句時,他們的執行順序是怎麼的呢?WHERE >GROUP BY>聚合函數。 

所以在WHERE語句執行過濾條件中我們不能使用聚合函數,使用的話就會報錯,在這我們可以使用HAVING子句執行過濾條件篩查時使用聚合函數。小夥伴們一定要記住!


最後呢小夢再分享一下SQL查詢語句各關鍵字的執行順序,可以拿小本本記一下瞭,有用的很~

重點】SQL的執行順序:

  1. 先執行FROM
  2. 再執行WHERE條件過濾
  3. 再執行GROUP BY分組
  4. 再執行SELECT,聚集函數
  5. 再執行HAVING條件過濾
  6. 再執行ORDER BY 排序

本文來自網絡,不代表程式碼花園立場,如有侵權,請聯系管理員。https://www.codegarden.cn/article/5477/
返回顶部