MySQL UPDATE 쿼리에서 CASE 문 사용하기
UPDATE 쿼리를 실행할 때 조건에 따라 서로 다른 값을 적용해야 하는 경우가 자주 있습니다. 이럴 때 CASE 문을 함께 사용하면 하나의 쿼리로 여러 조건 분기를 처리할 수 있어 매우 유용합니다.
예를 들어, 점수 범위에 따라 다른 방식으로 값을 갱신하는 상황을 생각해 볼 수 있습니다. 이번 글에서는 실제 예제를 통해 UPDATE 쿼리와 CASE 문을 결합하는 방법을 단계별로 살펴보겠습니다.
1단계: 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다. UserId는 자동 증가되는 기본 키로, UserScore는 사용자 점수를 저장하는 컬럼입니다.
mysql> create table DemoTable
(
UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY, UserScore int
);
Query OK, 0 rows affected (0.29 sec)2단계: 샘플 데이터 삽입
INSERT 명령을 사용해 테이블에 테스트용 레코드를 추가합니다.
mysql> insert into DemoTable(UserScore) values(100); Query OK, 1 row affected (0.22 sec) mysql> insert into DemoTable(UserScore) values(110); Query OK, 1 row affected (0.07 sec) mysql> insert into DemoTable(UserScore) values(120); Query OK, 1 row affected (0.08 sec) mysql> insert into DemoTable(UserScore) values(200); Query OK, 1 row affected (0.05 sec) mysql> insert into DemoTable(UserScore) values(230); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable(UserScore) values(250); Query OK, 1 row affected (0.03 sec) mysql> insert into DemoTable(UserScore) values(270); Query OK, 1 row affected (0.06 sec)
3단계: 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 정상적으로 입력되었는지 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------+-----------+ | UserId | UserScore | +--------+-----------+ | 1 | 100 | | 2 | 110 | | 3 | 120 | | 4 | 200 | | 5 | 230 | | 6 | 250 | | 7 | 270 | +--------+-----------+ 7 rows in set (0.00 sec)
4단계: UPDATE 쿼리에 CASE 문 적용
이제 핵심인 UPDATE 쿼리에 CASE 문을 적용해 보겠습니다. 점수 범위별로 갱신 규칙을 다르게 지정했습니다.
- 100~120점: 점수에 5를 더합니다.
- 130~230점: 점수에 10을 더합니다.
- 250점 이상: 점수에 5를 곱합니다.
- 그 외: 기존 값을 그대로 유지합니다.
mysql> update DemoTable
set UserScore =
CASE
WHEN UserScore BETWEEN 100 AND 120
THEN UserScore + 5
WHEN UserScore BETWEEN 130 AND 230
THEN UserScore +10
WHEN UserScore >=250
THEN UserScore * 5
ELSE UserScore
END;
Query OK, 7 rows affected (0.06 sec)
Rows matched: 7 Changed: 7 Warnings: 05단계: 업데이트 결과 확인
업데이트가 완료된 후 다시 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
조건에 따라 값이 올바르게 변경된 것을 확인할 수 있습니다.
+--------+-----------+ | UserId | UserScore | +--------+-----------+ | 1 | 105 | | 2 | 115 | | 3 | 125 | | 4 | 210 | | 5 | 240 | | 6 | 1250 | | 7 | 1350 | +--------+-----------+ 7 rows in set (0.00 sec)
정리
UPDATE 문에서 SET 절에 CASE 문을 사용하면 WHERE 절로 쿼리를 여러 번 나누어 실행하지 않고도, 단 한 번의 쿼리로 조건별 갱신 로직을 깔끔하게 처리할 수 있습니다. 특히 대량의 데이터를 범위 조건에 따라 일괄 수정해야 할 때 성능과 가독성 면에서 큰 이점을 얻을 수 있습니다. ELSE 절을 반드시 작성해 조건에 해당하지 않는 행의 값이 의도치 않게 NULL로 변경되지 않도록 주의하는 것도 중요한 팁입니다.