[SQL Study] 쿼리 '잘' 짜는 PO되기 / Update (Feat. 인프런-고급)
여러분 제가 드디어 중급 강의를 완강하고 고급 강의로 넘어왔어요 이야~~~~~소리질러~~~~~
요즘에 쿼리 공부하니까 이제 실무할 때 쿼리를 좀 빠르게 이해하고 짤 수 있게 돼서 행복하면서도..
나는 그럼 전략적 사고를 언제 해야하는가 싶은 고민이 들면서도 이래저래 고민이 많네요.
고민은 해봐야 시간만 흐르니, 일단 고민하지말고 남는 시간 쪼개서 쿼리도 공부하고 강의도 들으려구요.
오늘은 쿼리 1문제만 풀고, 탈잉에서 진행했던 월간스타텁 강의 다시듣기 하러 가야합니됴 ㅋㅋㅋㅋ
(아 회사에서 빌린 친절한 SQL 튜닝 책도 읽어야하는데, 하루가 24시간인게 너무 모자라요...)
우선 고급 첫번째 강의는 실제 데이터를 INSERT하고, UPDATE 하고, DELETE 하는 방법에 대해서 배웠어요.
그리고 그 다음 강의가 앞서 배운 INSERT, UPDATE, DELETE를 활용하여 풀 수 있는 문제입니다.
LeetCode의 627번 문제입니다.
627. Swap Salary
Table: Salary
+-------------+----------+
| Column Name | Type |
+-------------+----------+
| id | int |
| name | varchar |
| sex | ENUM |
| salary | int |
+-------------+----------+
id is the primary key for this table.
The sex column is ENUM value of type ('m', 'f'). The table contains information about an employee.
Write an SQL query to 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(s).
Note that you must write a single update statement, DO NOT write any select statement for this problem.
The query result format is in the following example:
Salary table:
+----+------+-----+--------+
| id | name | sex | salary |
+----+------+-----+--------+
| 1 | A | m | 2500 |
| 2 | B | f | 1500 |
| 3 | C | m | 5500 |
| 4 | D | f | 500 |
+----+------+-----+--------+
Result table:
+----+------+-----+--------+
| id | name | sex | salary |
+----+------+-----+--------+
| 1 | A | f | 2500 |
| 2 | B | m | 1500 |
| 3 | C | f | 5500 |
| 4 | D | m | 500 |
+----+------+-----+--------+
(1, A) and (3, C) were changed from 'm' to 'f'. (2, B) and (4, D) were changed from 'f' to 'm'.
문제를 해석해보자면 ID는 기본키이고, 성별의 타입은 m,f가 있고 employee 테이블과 Salary 테이블은 연결돼있다.
현재 테이블 성별에 m으로 표기돼있으면, f로 바꾸고 f로 표기돼있으면 m으로 바꾸면 된다.
별도의 temp 테이블을 생성하지 말고, Select 구문을 사용하지 말고 무조건 update statement로 문제를 풀라고 한다.
요건 이전 강의에서 힌트를 조금 주셨는데, Case 문으로 풀면 된다고 하셨다.
나는 금붕어일까? Case 문 배운지 얼마 안된 것 같은데 쓰는 방법을 또 까먹어서 구글링을 해보았다.
아래와 같은 형태로 쓰면 된다고 한다.
Case
When 조건식 1 THEN 결과 1
When 조건식 2 THEN 결과 2
When 조건식 3 THEN 결과 3
Else 결과
END
Case문을 SELECT 구문에 써서 아래와 같이 쿼리를 짜니 다음 결과가 나왔다.
SELECT *
, CASE
WHEN sex='m' THEN 'f'
WHEN sex='f' THEN 'm'
ELSE 'etc'
END
FROM Salary
["id", "name", "sex", "salary"],
[1, "A", "m", 2500],
[2, "B", "f", 1500],
[3, "C", "m", 5500],
[4, "D", "f", 500]]
아 그냥 원래 테이블 그대로 나왔는데, UPDATE 문과 CASE 문을 어떻게 합치면 되지?
처음에 SELECT 문이랑 UPDATE문이랑 다 썼더니 너무 헷갈렸다. UPDATE문은 처음 배운거라 어떻게 쓰는지가 좀 어려웠는데
UPDATE에 테이블명이 있으니, FROM절은 생략해도 될 것 같아 FROM 절을 지웠다.
그리고 SELECT는 어떻게 처리해야 하나 고민하다 구글링했더니 UPDATE 구문 쓸 때 굳이 셀렉트가 필수가 아니어서,
SELECT도 지우고 아래와 같이 썼다.
- 정답
UPDATE Salary
SET sex = CASE
WHEN sex='m' THEN 'f'
WHEN sex='f' THEN 'm'
ELSE 'etc'
END
그러니까 바로 Accepted! 라는 메세지가 떠서 순간 나도 깜짝놀랐다.
여기서 헷갈렸던 부분은 SET 구문 다음에 컬럼명 = CASE를 매칭해주는 것이었다.
원래는 SET 뒤에 컬럼명 = '내용' 이다 라는 식으로 작성해줘야 하는데, CASE도 똑같이 연결해주면 되는건가? 의아해하며 동일하게 써줬더니 갑자기 정답을 맞춰버렸다 ㅋㅋㅋㅋㅋㅋ낄낄
어부지리로 맞추니까 웃기기도 하고, 뿌듯하기도 하고 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
이제 강의에선 내가 생각했던 것과 어떻게 다르게 풀이해주시는지 체크해봐야겠다.
UPDATE 구문과 CASE문은 아래와 같은 형태로 사용해주면 된다.
UPDATE 테이블명
SET 컬럼명 =(대입연산자) CASE
WHEN 컬럼명1 THEN 결과1
WHEN 컬럼명2 THEN 결과2
ELSE 이 외 결과
END
(WHERE 조건식);
CASE 문의 추가 설명은 아래와 같이 설명해주셨다.
해석해보면, Name 이라는 컬럼을 아래와 같은 조건일 때 변경해달라는 것이고 그 조건은
ID가 '1'이면 '가'로 이름을 바꾸고, ID가 '2'이면 '나'로 이름을 바꿔달라는 것이다.
만약 응용을 해보고 싶다면 Salary 컬럼을 변경해보며 어떤 식으로 동작하는지 확인해보면 추후 UPDATE문과 CASE 문을 사용할 때
정확하게 이해하고 사용할 수 있을 것 같다.
오늘 1일 1코딩 끝~
