MySQL에서 하나의 열(컬럼)에 대해 여러 행을 서로 다른 값으로 한 번에 업데이트하려면 CASE 문을 사용하는 것이 가장 효율적입니다. 이 글에서는 예제 테이블을 만들고, CASE 문을 활용해 조건별로 각기 다른 값을 일괄 업데이트하는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 학생 ID와 수학 점수를 저장할 테이블을 생성합니다.
mysql> create table updateMultipleRowsDemo
-> (
-> StudentId int,
-> StudentMathScore int
-> );
Query OK, 0 rows affected (0.63 sec)
2. 테스트 데이터 삽입
INSERT 명령어를 사용해 테이블에 레코드를 추가합니다.
mysql> insert into updateMultipleRowsDemo values(10001,67); Query OK, 1 row affected (0.14 sec) mysql> insert into updateMultipleRowsDemo values(10002,69); Query OK, 1 row affected (0.15 sec) mysql> insert into updateMultipleRowsDemo values(10003,89); Query OK, 1 row affected (0.14 sec) mysql> insert into updateMultipleRowsDemo values(10004,99); Query OK, 1 row affected (0.13 sec) mysql> insert into updateMultipleRowsDemo values(10005,92); Query OK, 1 row affected (0.13 sec)
3. 현재 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select * from updateMultipleRowsDemo;
실행 결과는 다음과 같습니다.
+-----------+------------------+ | StudentId | StudentMathScore | +-----------+------------------+ | 10001 | 67 | | 10002 | 69 | | 10003 | 89 | | 10004 | 99 | | 10005 | 92 | +-----------+------------------+ 5 rows in set (0.00 sec)
4. CASE 문으로 여러 행 한 번에 업데이트
이제 핵심인 UPDATE 쿼리입니다. CASE 문을 사용하면 학생 ID에 따라 서로 다른 점수를 지정할 수 있습니다. 아래 예제에서는 StudentId가 10001부터 10003 사이인 행만 대상으로, 각각 다른 값으로 업데이트합니다.
mysql> UPDATE updateMultipleRowsDemo
-> SET StudentMathScore= CASE StudentId
-> WHEN 10001 THEN 45
-> WHEN 10002 THEN 52
-> WHEN 10003 THEN 67
-> END
-> WHERE StudentId BETWEEN 10001 AND 10003;
Query OK, 3 rows affected (0.19 sec)
Rows matched: 3 Changed: 3 Warnings: 0
쿼리 설명:
SET StudentMathScore = CASE StudentId ... END: StudentId 값에 따라 반환될 새로운 점수를 결정합니다.WHEN 10001 THEN 45: StudentId가 10001이면 점수를 45로 변경합니다.WHERE StudentId BETWEEN 10001 AND 10003: 업데이트 범위를 특정 조건으로 제한하여, 의도하지 않은 행까지 변경되는 것을 방지합니다.
5. 업데이트 결과 확인
값이 정상적으로 변경되었는지 다시 조회해 보겠습니다.
mysql> select * from updateMultipleRowsDemo;
결과를 보면 해당 세 개의 행만 새로운 값으로 변경된 것을 확인할 수 있습니다.
+-----------+------------------+ | StudentId | StudentMathScore | +-----------+------------------+ | 10001 | 45 | | 10002 | 52 | | 10003 | 67 | | 10004 | 99 | | 10005 | 92 | +-----------+------------------+ 5 rows in set (0.00 sec)
마무리 및 참고 사항
이처럼 MySQL에서는 CASE 문과 WHERE 절을 함께 사용하면 여러 개의 UPDATE 쿼리를 실행하지 않고도 단일 쿼리로 여러 행을 효율적으로 업데이트할 수 있습니다. 이는 네트워크 왕복 횟수를 줄여 성능 면에서도 유리합니다.
다만 주의할 점은, CASE 문에 포함되지 않은 조건의 행이 WHERE 범위 안에 있다면 해당 열이 NULL로 설정될 수 있으므로, 반드시 WHERE 절로 업데이트 대상 범위를 명확히 지정해야 합니다. 또한 ELSE 절을 추가해 기본값을 지정하는 것도 안전한 방법입니다.