MySQL에서 데이터를 수정할 때 가장 중요한 것이 있다면 바로 WHERE 조건이다.
UPDATE 문 자체는 단순하지만, WHERE 절을 제대로 작성하지 않으면 수천, 수만 건의 데이터가 의도치 않게 바뀔 수 있다.

✅ UPDATE + WHERE의 기본 구조
UPDATE 테이블명
SET 컬럼명 = 새로운값
WHERE 조건;
여기서 WHERE 절은 데이터를 필터링하여 수정 범위를 제한하는 핵심 요소이다.
조건 없이 실행하면 전체 테이블이 수정되므로 반드시 사용해야 한다.
✅ WHERE 절 없이 실행했을 때의 위험
UPDATE users SET status = 'inactive';
이 쿼리는 users 테이블의 모든 행의 status를 'inactive'로 바꾼다.
원하지 않는 대량 수정이 발생할 수 있으므로 WHERE 절은 선택이 아니라 필수이다.
✅ 단일 조건 예제
UPDATE members
SET points = 0
WHERE id = 1001;
특정 회원의 포인트를 초기화하는 기본적인 조건문이다.
id, username, email 등 고유한 키 기준으로 정확한 타겟팅이 가능하다.
✅ 복수 조건 (AND, OR)
AND 조건
UPDATE orders
SET status = '취소'
WHERE user_id = 501 AND status = '결제완료';
두 가지 조건을 모두 만족해야 수정된다. 정밀한 필터링에 사용된다.
OR 조건
UPDATE products
SET discount = 10
WHERE category = '식품' OR category = '생활용품';
둘 중 하나라도 만족하면 업데이트된다. 대상 범위를 넓힐 때 유용하다.
✅ BETWEEN, IN 조건
날짜 범위
UPDATE events
SET is_active = 0
WHERE start_date BETWEEN '2024-01-01' AND '2024-06-30';
특정 기간 안의 데이터를 일괄 수정할 때 매우 유용하다.
IN 조건
UPDATE users
SET user_type = 'internal'
WHERE id IN (101, 102, 103, 104);
여러 개의 고유값에 대해 한번에 조건을 걸 수 있다.
✅ IS NULL, IS NOT NULL
UPDATE orders
SET shipping_status = '대기중'
WHERE shipped_at IS NULL;
UPDATE members
SET verified = 1
WHERE email IS NOT NULL;
NULL 체크는 초기값이 없거나 누락된 데이터에 대한 처리에 매우 유용하다.
✅ LIKE 패턴 조건
UPDATE users
SET nickname = CONCAT(nickname, '_old')
WHERE nickname LIKE 'guest%';
게스트 계정에 _old를 붙여 별도 관리할 수 있도록 처리한 예제이다.
LIKE, REGEXP를 이용한 패턴 매칭은 대량의 유사 데이터 처리에 적합하다.
✅ 서브쿼리와 함께 쓰기
UPDATE products
SET discount_price = price * 0.9
WHERE id IN (
SELECT product_id FROM promotions WHERE type = '한정할인'
);
서브쿼리를 활용하면 다른 테이블의 조건에 따라 대상 데이터를 정교하게 추출할 수 있다.
✅ 실전 예제: 로그인 이력 기준 사용자 상태 변경
UPDATE users
SET status = '휴면'
WHERE last_login < NOW() - INTERVAL 1 YEAR
AND status = '활성';
로그인 기준으로 1년 이상 활동이 없는 사용자만 필터링하여 휴면처리하는 방식이다.
조건을 적절히 조합하면 운영 정책을 SQL로 깔끔하게 반영할 수 있다.
✅ 조건 작성 시 주의할 점
| 항목 | 설명 |
| WHERE 생략 | 전체 행이 수정됨 |
| 인덱스 없는 조건 | 성능 저하 발생 가능 |
| 넓은 조건 사용 | 불필요한 데이터까지 수정될 위험 있음 |
| 조건 테스트 | 반드시 SELECT로 먼저 검증해볼 것 |
조건에 맞는 데이터를 수정하기 전에는 다음과 같이 SELECT로 먼저 확인하는 습관이 중요하다.
SELECT * FROM users WHERE status = 'active' AND last_login IS NULL;
이렇게 하면 실제로 어떤 데이터가 수정될지를 사전에 확인 가능하다.
✅ 공식 문서 참고
'DB' 카테고리의 다른 글
| [MySQL] UPDATE + NOW() 함수로 날짜 자동 수정하는 실전 활용법 (0) | 2025.06.30 |
|---|---|
| [MySQL] UPDATE + IF / CASE 문으로 조건부 데이터 수정하는 실전 가이드 (1) | 2025.06.30 |
| [MySQL] UPDATE + 서브쿼리 완전 정복 – 조건 기반 동적 수정의 핵심 기술 (0) | 2025.06.30 |
| [MySQL] UPDATE + JOIN 활용법 완전 정리 – 다중 테이블을 수정하는 강력한 방법 (0) | 2025.06.30 |
| [MySQL] UPDATE로 다중 컬럼 동시에 수정하는 방법 완벽 정리 (0) | 2025.06.30 |
| [MySQL] UPDATE 기본 문법 완벽 정리 – 데이터 수정 (3) | 2025.06.30 |
| [MySQL] SELECT INTO OUTFILE + LOAD DATA INFILE 완벽 가이드 – 쿼리 결과 파일로 저장하고 다시 불러오는 방법 (0) | 2025.06.30 |
| [MySQL] SELECT INTO OUTFILE로 결과를 파일로 저장하는 방법 총정리 (0) | 2025.06.30 |