MySQL에서 여러 행의 데이터를 한 번의 쿼리로 조건에 따라 다르게 수정해야 할 때, CASE WHEN/THEN/ELSE 구문을 활용하면 효율적으로 대량 업데이트를 수행할 수 있습니다. 이 방식은 개별 UPDATE 문을 여러 번 실행하는 것보다 성능 면에서 유리합니다.
CASE WHEN/THEN/ELSE를 사용한 대량 업데이트 기본 문법
UPDATE yourTableName SET yourColumnName = CASE
WHEN yourColumnName = Value1 THEN anyUpdatedValue1
WHEN yourColumnName = Value2 THEN anyUpdatedValue2
WHEN yourColumnName = Value3 THEN anyUpdatedValue3
WHEN yourColumnName = Value4 THEN anyUpdatedValue4
ELSE yourColumnName
END;위 문법에서 ELSE 절은 조건에 해당하지 않는 나머지 행의 값을 그대로 유지하는 역할을 합니다. 만약 ELSE 절을 생략하면 조건에 맞지 않는 행의 값이 NULL로 변경될 수 있으므로 주의해야 합니다.
예제 테이블 생성
문법을 실제로 이해하기 위해 먼저 예제 테이블을 생성해 보겠습니다.
mysql> CREATE TABLE CaseUpdateDemo (
-> Id int,
-> Name varchar(100)
-> );
Query OK, 0 rows affected (0.78 sec)샘플 데이터 삽입
INSERT 명령어를 사용하여 테이블에 레코드를 추가합니다.
mysql> INSERT INTO CaseUpdateDemo VALUES(1, 'John'); Query OK, 1 row affected (0.17 sec) mysql> INSERT INTO CaseUpdateDemo VALUES(2, 'Carol'); Query OK, 1 row affected (0.27 sec) mysql> INSERT INTO CaseUpdateDemo VALUES(3, 'Mike'); Query OK, 1 row affected (0.11 sec) mysql> INSERT INTO CaseUpdateDemo VALUES(4, 'Bob'); Query OK, 1 row affected (0.15 sec)
삽입된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> SELECT * FROM CaseUpdateDemo;
실행 결과
+------+-------+ | Id | Name | +------+-------+ | 1 | John | | 2 | Carol | | 3 | Mike | | 4 | Bob | +------+-------+ 4 rows in set (0.00 sec)
CASE WHEN/THEN/ELSE로 대량 업데이트 실행
이제 앞서 설명한 문법을 적용하여 Id 컬럼의 값을 한 번의 쿼리로 일괄 변경해 보겠습니다.
mysql> UPDATE CaseUpdateDemo SET Id = CASE
-> WHEN Id = 1 THEN 1001
-> WHEN Id = 2 THEN 1002
-> WHEN Id = 3 THEN 1003
-> WHEN Id = 4 THEN 1004
-> ELSE Id
-> END;
Query OK, 4 rows affected (0.15 sec)
Rows matched: 4 Changed: 4 Warnings: 0쿼리 실행 결과, 총 4개의 행이 매칭되었고 4개의 행이 모두 변경되었습니다.
업데이트 결과 확인
SELECT 문으로 Id 컬럼이 정상적으로 업데이트되었는지 확인합니다.
mysql> SELECT * FROM CaseUpdateDemo;
실행 결과
+------+-------+ | Id | Name | +------+-------+ | 1001 | John | | 1002 | Carol | | 1003 | Mike | | 1004 | Bob | +------+-------+ 4 rows in set (0.00 sec)
정리
CASE WHEN/THEN/ELSE 구문을 활용하면 조건별로 서로 다른 값을 지정하여 단일 UPDATE 문으로 여러 행을 동시에 수정할 수 있습니다. 이는 데이터베이스와의 통신 횟수를 줄여주고 트랜잭션 처리도 간편하게 만들어 주기 때문에, 대량의 조건부 업데이트 작업 시 매우 유용한 기법입니다.