DML 개요 INSERT UPDATE ⚠️ WHERE DELETE 📝 문제풀이
◀ 이전 📋 목차 CH 09 ▶
✏️ CHAPTER 08 · 중급

데이터 조작 — 넣고, 바꾸고, 지우기 (DML)

지금까지는 데이터를 조회(SELECT)만 했죠. 이번 장에서는 실제로 데이터를 넣고(INSERT)·바꾸고(UPDATE)·지우는(DELETE) 방법을 배워요. 조회와 달리 진짜로 데이터가 바뀌니, 특히 WHERE를 조심해서 다뤄야 해요.

🎯 이 장을 끝내면
📖
DML 개요
데이터를 넣고·바꾸고·지우기
조회는 "구경", DML은 "실제로 손대기"예요.

DML(Data Manipulation Language, 데이터 조작어)은 테이블 안의 데이터 자체를 바꾸는 명령어들이에요. 크게 세 가지 — 넣기(INSERT)·바꾸기(UPDATE)·지우기(DELETE) — 가 있어요.

명령어하는 일한 문장으로
INSERT을 넣기"이 데이터를 추가해줘"
UPDATE기존 값 바꾸기"이 행의 값을 이걸로 바꿔줘"
DELETE 지우기"이 행을 지워줘"
🔍 조회(SELECT)와 뭐가 다를까? SELECT — 데이터를 꺼내 보기만 해요. 아무리 여러 번 실행해도 원본 데이터는 그대로예요.
DML(INSERT·UPDATE·DELETE) — 실행하면 테이블의 데이터가 진짜로 바뀌어요. 되돌리기가 쉽지 않을 수 있어요. 💡 그래서 DML은 "실행 = 실제 변경". 특히 실무 데이터에서는 WHERE 조건을 다시 한 번 확인하는 습관이 중요해요.
DML INSERT UPDATE DELETE VALUES SET WHERE 행(row)
🧭
이번 장의 핵심 한 줄. "INSERT는 넣기, UPDATE는 바꾸기, DELETE는 지우기 — 그리고 WHERE가 대상을 정한다." 이 한 문장만 잡고 가면 됩니다.
INSERT
새 데이터 넣기 — INSERT INTO ... VALUES
"어느 테이블의, 어느 열에, 어떤 값을" 넣을지 적어요.

새 행을 넣을 때는 INSERT INTO 뒤에 테이블 이름과 열 목록을, VALUES 뒤에 넣을 값을 적어요.

INSERT INTO users (name, age)   -- ① 어느 테이블의 어느 열에
VALUES ('철수', 20);            -- ② 어떤 값을 (name='철수', age=20)
INSERT 실행 후 users
idnameage
1'영희'25
2'민수'30
3'철수'20
🎯 순서·개수를 반드시 맞추기 열 목록 (name, age)와 값 목록 ('철수', 20)순서대로 짝이 돼요 — name'철수', age20.
그래서 열의 개수와 값의 개수가 같아야 하고, 순서도 서로 맞아야 해요. 문자열은 따옴표(' ')로, 숫자는 그냥 적어요. ⚠️ 열 2개인데 값 1개(또는 3개)를 주면 오류가 나요. "열 개수 = 값 개수"를 항상 확인!

여러 행을 한 번에 넣을 수도 있어요. VALUES 뒤에 괄호 묶음을 콤마로 이어 붙이면 돼요.

INSERT INTO users (name, age)
VALUES ('철수', 20),
       ('영수', 22),
       ('지민', 19);   -- 세 행을 한 번에 삽입
💡
열 목록을 생략하고 INSERT INTO users VALUES (...) 처럼 쓸 수도 있지만, 그러면 테이블의 모든 열에 순서대로 값을 다 채워야 해요. 실무에서는 열 목록을 명시하는 편이 안전하고 읽기도 좋아요.
🔧
UPDATE
기존 데이터 바꾸기 — UPDATE ... SET ... WHERE
SET으로 바꿀 값, WHERE로 바꿀 대상을 정해요.

이미 있는 데이터를 수정할 때는 UPDATE를 써요. SET어떤 열을 어떤 값으로 바꿀지, WHERE어떤 행을 바꿀지 적어요.

UPDATE users
SET age = 21        -- ① age 열을 21로 바꿔라
WHERE id = 1;       -- ② 단, id가 1인 행만
UPDATE 실행 후 users (id=1의 age가 20→21)
idnameage
1'철수'21
2'영희'25
3'민수'30
🧩 한 번에 여러 열도 바꾸기 SET 뒤에 콤마로 이어 여러 열을 동시에 바꿀 수 있어요.
예: SET age = 21, name = '철이' → 나이와 이름을 함께 수정. 💡 값을 계산해서 넣을 수도 있어요 — SET age = age + 1 처럼 "현재 나이 + 1"로 바꾸는 것도 가능해요.
🔎
UPDATE의 WHERE는 "어느 행을 바꿀지" 정하는 조준경이에요. WHERE id = 1이면 id가 1인 행만 바뀌어요. 이 조건을 어떻게 쓰느냐가 다음 섹션에서 가장 중요한 이야기가 됩니다.
⚠️
가장 중요 · WHERE
WHERE를 빠뜨리면 테이블 전체가 바뀝니다
이 장에서 딱 하나만 기억한다면 바로 이거예요.

UPDATEDELETEWHERE로 대상을 좁히지 않으면, 테이블의 모든 행에 적용돼요. 실수로 WHERE를 빼면 전체 데이터가 한꺼번에 수정·삭제되는 거죠.

-- ❌ 위험! WHERE가 없다
UPDATE users SET age = 0;   -- 모든 사람의 나이가 0이 됨!!

-- ✅ 안전. 대상을 콕 집었다
UPDATE users SET age = 0 WHERE id = 1;
WHERE 없는 UPDATE users SET age = 0; 의 결과 (전멸)
idnameage
1'철수'0
2'영희'0
3'민수'0
⚠️
실무 대형 사고 단골 1위. WHERE를 빠뜨린 UPDATE·DELETE테이블 전체를 날려버리는 사고로 이어져요. 실제로 회사에서 수십만 건이 한 줄로 지워지는 일이 종종 벌어집니다.
습관 세 가지 —WHERE를 먼저 쓰고 SET/DELETE를 나중에 완성하기, ② 실행 전에 같은 조건으로 SELECT 해서 몇 행이 걸리는지 확인하기, ③ 중요한 작업 전 백업 확인하기.
🧪 실행 전 확인 요령 바꾸거나 지우기 전에, 같은 WHERE로 먼저 SELECT를 해보세요.
SELECT * FROM users WHERE id = 1; → 딱 그 행만 나오면 안전한 조건이라는 뜻이에요. 💡 SELECT는 아무리 실행해도 데이터가 안 바뀌니까, "리허설"로 안성맞춤이에요.
🗑️
DELETE
데이터 지우기 — DELETE FROM ... WHERE
행을 지워요. WHERE가 없으면 모든 행이 사라져요.

DELETE는 테이블에서 행(데이터)을 지워요. UPDATE와 마찬가지로 WHERE로 지울 대상을 정해요.

DELETE FROM users
WHERE id = 3;       -- id가 3인 행만 삭제
DELETE 실행 후 users (id=3 행이 사라짐)
idnameage
1'철수'20
2'영희'25
3'민수'30
⚠️
WHERE 없는 DELETE FROM users;모든 행을 삭제해요. 테이블 껍데기(구조)는 남지만 안의 데이터는 전부 사라져요. 앞 섹션의 확인 습관을 꼭 지키세요.
🆚 DELETE vs DROP — 헷갈리지 말기 DELETE — 테이블 안의 행(데이터)을 지워요. 테이블 자체는 그대로 남아요.
DROP테이블 자체(구조까지 통째로)를 없애요. 테이블이 아예 사라져요. 💡 즉 DELETE는 "표 안의 줄을 지우기", DROP은 "표 자체를 없애기". DROP은 DDL이고, 다음 CH 09에서 다뤄요.
🧠 이 장 핵심 요약
🎁 한 걸음 더

많은 DB 도구는 실수 방지를 위해 "안전 모드(safe update)"를 제공해요. 예를 들어 MySQL Workbench에는 WHERE 없는 UPDATE·DELETE를 아예 막아주는 옵션이 있어요. 또 변경 작업을 트랜잭션(BEGINCOMMIT/ROLLBACK)으로 감싸면, 잘못됐을 때 ROLLBACK으로 되돌릴 수도 있어요. (트랜잭션은 이후 심화 주제예요.)

🔤
트랜잭션(transaction) — 여러 개의 작업을 "하나의 묶음"으로 다뤄서, 전부 성공하거나 전부 취소되도록 보장하는 단위예요. 중간에 문제가 생기면 ROLLBACK으로 실행 전 상태로 되돌릴 수 있어서, WHERE 실수 같은 사고를 막는 안전장치가 돼요. (자세한 원리는 CH 10에서 배워요.)
📝
문제풀이 · 점검
배운 걸 가볍게 점검해봐요
시험이 아니라 "내가 이해했나" 확인용이에요. 틀려도 바로 해설이 나와요.
🧪
문제를 풀면 즉시 정답과 해설이 나오고, 위쪽 바에 점수가 쌓여요. 네 가지 유형(객관식 · O/X · 빈칸 · 쿼리결과)을 섞어 두었어요.
CH 09 🏗️ 테이블과 제약 조건 — CREATE·DROP으로 테이블을 만들고, 기본 키·NOT NULL 같은 제약 걸기