MySQL에서 특정 열의 값을 일괄 수정할 때, 단 하나의 값이나 특정 행만 그대로 유지해야 하는 경우가 종종 있습니다. 이럴 때 IF() 함수를 사용하면 조건 평가 결과에 따라 서로 다른 값을 할당해, 원하는 행만 업데이트 대상에서 손쉽게 제외할 수 있습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable736 (
CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
CustomerName varchar(100),
isMarried boolean
);
Query OK, 0 rows affected (0.53 sec)
2. 샘플 데이터 삽입
INSERT 문을 사용해 여러 고객 레코드를 추가합니다. 이때 'Carol'만 결혼 여부(isMarried)가 1(true)이고, 나머지는 모두 0(false)입니다.
mysql> insert into DemoTable736(CustomerName,isMarried) values('Chris',0);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable736(CustomerName,isMarried) values('Robert',0);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable736(CustomerName,isMarried) values('David',0);
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable736(CustomerName,isMarried) values('Mike',0);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable736(CustomerName,isMarried) values('Carol',1);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable736(CustomerName,isMarried) values('Bob',0);
Query OK, 1 row affected (0.20 sec)
3. 현재 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable736;
실행 결과는 다음과 같습니다.
+------------+--------------+-----------+ | CustomerId | CustomerName | isMarried | +------------+--------------+-----------+ | 1 | Chris | 0 | | 2 | Robert | 0 | | 3 | David | 0 | | 4 | Mike | 0 | | 5 | Carol | 1 | | 6 | Bob | 0 | +------------+--------------+-----------+ 6 rows in set (0.00 sec)
4. IF() 함수로 특정 값 하나만 제외하고 업데이트하기
핵심은 IF(조건, 참일_때_값, 거짓일_때_값) 구문입니다. 아래 쿼리는 CustomerId가 6인 'Bob'의 isMarried 값은 기존 값을 그대로 유지하고, 나머지 모든 행은 1로 변경합니다.
mysql> update DemoTable736 set isMarried=if(CustomerId=6,isMarried,1); Query OK, 5 rows affected (0.13 sec) Rows matched: 6 Changed: 5 Warnings: 0
동작 원리를 살펴보면 다음과 같습니다.
- 조건 —
CustomerId = 6 - 참일 때 —
isMarried: 자기 자신의 현재 값을 그대로 반환하므로 사실상 변경이 없습니다. - 거짓일 때 —
1: 조건에 해당하지 않는 모든 행에 새 값이 할당됩니다.
결과적으로 6개 행이 조건에 매칭되었지만 실제로 값이 바뀐 것은 5개 행(Changed: 5)입니다. 'Bob'의 행은 기존 값이 유지되어 변경 대상에서 제외된 것입니다.
5. 업데이트 결과 확인
테이블을 다시 조회해 보겠습니다.
mysql> select *from DemoTable736;
'Bob'만 0으로 남아 있고 나머지는 모두 1로 변경된 것을 확인할 수 있습니다.
+------------+--------------+-----------+ | CustomerId | CustomerName | isMarried | +------------+--------------+-----------+ | 1 | Chris | 1 | | 2 | Robert | 1 | | 3 | David | 1 | | 4 | Mike | 1 | | 5 | Carol | 1 | | 6 | Bob | 0 | +------------+--------------+-----------+ 6 rows in set (0.00 sec)
6. 참고: WHERE 절과 CASE 식을 활용한 대안
같은 작업은 WHERE 절로도 간단히 처리할 수 있습니다. 제외할 행의 조건을 부정형(<>)으로 걸어주면 됩니다.
mysql> update DemoTable736 set isMarried=1 where CustomerId <> 6;
또는 CASE 식을 사용해 조건 분기를 명시적으로 작성할 수도 있습니다.
mysql> update DemoTable736
set isMarried = case when CustomerId = 6 then isMarried else 1 end;
단순히 "특정 행만 빼고 같은 값으로 바꾸는" 상황이라면 WHERE 절 방식이 가장 직관적이고, 행마다 다른 값을 지정해야 하는 복잡한 로직이라면 IF()나 CASE 식이 더 유용합니다.
마무리
MySQL에서 특정 값 하나만 제외하고 나머지 행을 일괄 업데이트하려면 IF() 함수 안에 "제외 조건 → 기존 값 유지 / 나머지 → 새 값" 구조를 넣어주면 됩니다. WHERE 절이나 CASE 식까지 함께 익혀두면 상황에 맞는 최적의 쿼리를 선택할 수 있습니다.