Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 특정 값 하나만 제외하고 전체 행을 업데이트하는 방법 (IF() 함수 활용)

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 식까지 함께 익혀두면 상황에 맞는 최적의 쿼리를 선택할 수 있습니다.