개발은 처음이라 개발새발
서브쿼리를 활용한 DELETE [LeetCode] 본문
https://leetcode.com/problems/delete-duplicate-emails/
이번에는 DELETE 구문 연습을 가장한 서브쿼리 퀴즈를 한번 풀어보겠습니다.
Input:
Person table:
+----+------------------+
| id | email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
| 3 | john@example.com |
+----+------------------+
Output:
+----+------------------+
| id | email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
+----+------------------+
Explanation: john@example.com is repeated two times. We keep the row with the smallest Id = 1.
문제를 보면 id 1과 3의 email이 같은 것으로 보입니다. 그리고 이 중복된 것들 중 id의 숫자가 작은 id =1만 살리고 3은 삭제 시켜달라는 문제입니다. 이렇게만 보면 "DELETE FROM Person WHERE id =3 ;"으로 끝낼 수 있지만 그렇게 하면 퀴즈가 아니겠죠? 문제는 결국 단순 id =3을 삭제해달라는 것이 아니라 이렇게 중복값이 나왔을 때 id가 작은 값만 남겨달라는 겁니다. 일단 그러면 id가 작은 걸 찾아야 합니다.
#중복된 email 값들 중 최소 id 찾기
SELECT mini.min_id
FROM (SELECT email, min(id) AS min_id
FROM Person
GROUP BY email) mini
네 이렇게 서브퀴리를 작성해봤는데요. 서브쿼리는 SELECT, FROM, WHERE 구문에서 다양하게 사용됩니다. 서브쿼리에 대해서는 다음에 더 자세하게 다뤄보겠습니다. 아무튼 이번에는 FROM절에 서브쿼리를 사용해 GROUP BY로 email를 묶고 그중 최소 id 값을 찾았습니다. 여기서 궁금한 점은 SELECT 앞에 mini.min_id는 무엇일까일텐데요. FROM 절에 사용한 서브쿼리를 괄호로 묶고 옆에 mini라고 적었는데요. 이렇게 하면 서브쿼리를 하나의 테이블로 활용할 수 있습니다. 그리고 서브쿼리 안에서 min(id)를 min_id라고 지칭했으니 최소 id를 뽑기 위해서는 mini테이블의 min_id 즉, mini.min_id를 뽑아달라 해야 합니다. 이렇게 서브쿼리를 완성했으니 최종 쿼리를 작성해보겠습니다.
DELETE FROM Person
WHERE id NOT IN (SELECT mini.min_id
FROM (SELECT email, min(id) AS min_id
FROM Person
GROUP BY email) mini)
_______________________________________________________________
Output
| id | email |
| -- | ---------------- |
| 1 | john@example.com |
| 2 | bob@example.com |
'mysql' 카테고리의 다른 글
Top Earners 서브쿼리 퀴즈 [해커랭크] (1) | 2023.06.06 |
---|---|
서브쿼리 간단정리 (0) | 2023.05.31 |
UPDATE 와 CASE를 활용한 퀴즈[LeetCode] (0) | 2023.05.29 |
INSERT, UPDATE, DELETE 간단 정리 (0) | 2023.05.27 |
MySQL Union 퀴즈 [해커랭크] (0) | 2023.05.21 |