๐ ๋ณธ ํฌ์คํ ์์ ์ฌ์ฉ๋๋ ํ ์ด๋ธ์ ์๋ฃ์ ์ถ์ฒ๋ Leetcode์์ ๋ฐํ๋๋ค. ๋ ๋ค์ํ SQL ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์๋ ค๋ฉด Leetcode ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํด ๋ณด์ธ์!
์ด๋ฒ ํฌ์คํ ์์ ์๊ฐํ ๋ฌธ์ ์ ํ์ด๋ฒ์ Leetcode์ 196๋ฒ, 627๋ฒ ๋ฌธ์ ์ด๋ค. ํน์ดํ๊ฒ๋ ์ด ๋ฌธ์ ๋ค์ SELECT ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ DELETE, UPDATE ๋ฌธ์ ์ฌ์ฉํด์ผ ํ๋ค. ์ฐธ๊ณ ๋ก SELECT, DELETE, INSERT, UPDATE๋ DB์ DML(Data Manipulation Language)์ด๋ค. ๋ฌธ์ ์ ๋ํ ์ธ๋ถ์ ์ธ ์ฌํญ์ Leetcode ์ฌ์ดํธ์ ํด๋น ๋ฌธ์ ๋ฅผ ์ฐธ๊ณ ํ์.
๋จผ์ 196๋ฒ ๋ฌธ์ ์ ๋ฌธ์ ์์ ์๊ตฌํ๋ ์ถ๋ ฅ ํํ๋ฅผ ์ดํด๋ณด์.
Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique emails based on its smallest Id.
(Person์ด๋ผ๋ ํ ์ด๋ธ์์ ์ค๋ณต๋ ์ด๋ฉ์ผ๋ค์ ๋ชจ๋ ์ญ์ ํด๋ผ, ์ด ๋ ๊ฐ์ฅ ์์ id๊ฐ์ ๋ฐ์ดํฐ๋ง ๋จ๊ฒจ๋ผ)
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
- DELETE ์ ์๋ธ์ฟผ๋ฆฌ SELECT ๋ฌธ์ ์ฌ์ฉํด ํด๊ฒฐ
- DELETE ์ Self JOIN์ ์ฌ์ฉํด ํด๊ฒฐ
์ฐ์ 1๋ฒ์งธ ๋ฐฉ๋ฒ์ ํด๋นํ๋ ์ ๋ต SQL ๊ตฌ๋ฌธ์ ์ดํด๋ณด์.
DELETE
FROM Person
WHERE Id NOT IN (SELECT * FROM(SELECT MIN(Id)
FROM Person
GROUP BY Email) AS sub)
์ฐ์ ์ค๋ณต๋๋ ์ด๋ฉ์ผ์ ์ฐพ๊ธฐ ์ํด Email๋ก ๊ทธ๋ฃนํ์ ์ํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ผํ Email ์ค Id๊ฐ์ด ๊ฐ์ฅ ๋ฎ์ ๋ฐ์ดํฐ ์ด์ธ์ ๋ฐ์ดํฐ๋ค์ ๋ชจ๋ ์ญ์ ํ ๊ฒ์ด๋ฏ๋ก ์์ ๊ฐ์ด ์๋ธ์ฟผ๋ฆฌ ํํ๋ก ๋ง๋ค์ด ์ค๋ค.
๋ค์์ 2๋ฒ์งธ ๋ฐฉ๋ฒ์ ํด๋นํ๋ ์ ๋ต SQL ๊ตฌ๋ฌธ์ ๋ณด์.
DELETE p1
FROM Person AS p1
INNER JOIN Person AS p2 ON p1.Email = p2.Email
WHERE p1.Id > p2.Id
์ด ๊ตฌ๋ฌธ ์ค ๊ฐ์ฅ ์ค์ํ๋ค๊ณ ํ ์ ์๋ ๋ถ๋ถ์ DELETE ๊ตฌ๋ฌธ์์์ Self Join์ ์ํํ๋ค๋ ๊ฒ์ด๋ค. ๋์ผํ Email ๊ฐ์ ๊ธฐ์ค์ผ๋ก JOIN ์ ์ํจ๋ค๋ฉด ๋ค์ ํ ์ด๋ธ๊ณผ ๊ฐ์์ง๋ค.
p1.Id | p1.Email | p2.Id | p2.Email |
1 | john@example.com | 1 | john@example.com |
3 | john@example.com | 1 | john@example.com |
2 | bob@example.com | 2 | bob@example.com |
1 | john@example.com | 3 | john@example.com |
3 | john@example.com | 3 | john@example.com |
๊ทธ๋ฆฌ๊ณ ์ ํ ์ด๋ธ ํํ์์ p1.Id ๊ฐ์ด p2.Id ๊ฐ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ค์ ์ญ์ ์์ผ์ฃผ๋ฉด ๋ฌธ์ ์์ ์๊ตฌํ๋ ํํ์ธ ๋ค์๊ณผ ๊ฐ์ ํ ์ด๋ธ์ด ๋์ค๊ฒ ๋๋ค.
p1.Id | p1.Email |
1 | john@example.com |
2 | bob@example.com |
์ถ๊ฐ์ ์ผ๋ก JOIN์ ๊ตฌํํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ธฐ ์ํด ํด๋น ๋ฌธ์ ์ ๋ํ ๋ ๋ค๋ฅธ SQL ํ์ด๋ฅผ ์ ์ํด ๋ณธ๋ค.
DELETE p1
FROM Person AS p1, Person AS p2
WHERE p1.Email = p2.Email AND p1.Id > p2.Id
๋ค์์ 627๋ฒ ๋ฌธ์ ์ ๋ฌธ์ ์์ ์๊ตฌํ๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ์ด๋ค.(UPDATE ๊ตฌ๋ฌธ ๊ตฌ์กฐ์ ๋ํด ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์.)
Given a table salary, such as the one below, that has m=male and f=female values. Swap all f and m values (i.e., change all f values to m and vice versa) with a single update statement and no intermediate temp table.Note that you must write a single update statement, DO NOT write any select statement for this problem.
(ํ๋จ์ salary ํ ์ด๋ธ์์ sex ๋ณ์์ m๊ฐ์ f๊ฐ์ผ๋ก, f๊ฐ์ m๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด๋ผ. ๋จ, SELECT ๊ตฌ๋ฌธ์ด ์๋ UPDATE ๊ตฌ๋ฌธ๋ง์ ์ฌ์ฉํด์ผ ํ๋ค.)
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์์ด์ ์ค์ํ๊ฒ ์ฌ์ฉ๋๋ ๋ฌธ๋ฒ์ IF ๊ตฌ๋ฌธ์ด๋ค. IF ๊ตฌ๋ฌธ์ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์. IF ๊ตฌ๋ฌธ์ ์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
IF( ์กฐ๊ฑดA , ์กฐ๊ฑดA๊ฐ ์ฐธ์ผ ๋์ value , ์กฐ๊ฑดA๊ฐ ๊ฑฐ์ง์ผ ๋์ value )
์ด ๊ตฌ๋ฌธ๋ง ์๋ฉด ๋ฌธ์ ํ์ด๊ฐ ์์กฐ๋ก์ ์ง๋ค. ์ ๋ต SQL ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ๋ค.
UPDATE salary
SET sex = IF(sex = 'm', 'f', 'm')
์ฆ, sex ์นผ๋ผ์ ๊ฐ์ด 'm' ์ด๋ผ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค๋ฉด 'f' ๊ฐ์, ๋ง์ฝ sex ์นผ๋ผ ๊ฐ์ด 'm'์ด ์๋๋ผ๋ฉด 'm' ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ๋ผํ๋ผ๋ ์๋ฏธ์ด๋ค.
'SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SQL] MySQL - Window Function์ผ๋ก ๋ฌธ์ ํ๊ธฐ(Leetcode - 180, 184, 185๋ฒ) (0) | 2021.01.30 |
---|---|
[SQL] MySQL - ๋๋ง์ Function ๋ง๋ค๊ธฐ(Leetcode - 177๋ฒ) (0) | 2021.01.29 |
[SQL] MySQL - SET ๊ณผ ์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉํ๊ธฐ (4) | 2021.01.26 |
[SQL] MySQL - ORDER BY ์ IN ํจ๊ป ์ฌ์ฉํ๊ธฐ (0) | 2021.01.26 |
[SQL] MySQL - ALL ์ฌ์ฉ๋ฒ (0) | 2021.01.25 |