지금까지는 데이터를 조회(SELECT)만 했죠. 이번 장에서는 실제로 데이터를 넣고(INSERT)·바꾸고(UPDATE)·지우는(DELETE) 방법을 배워요. 조회와 달리 진짜로 데이터가 바뀌니, 특히 WHERE를 조심해서 다뤄야 해요.
INSERT로 새 행을 넣을 수 있어요 — 열 목록과 값의 순서·개수를 맞춰서요.UPDATE로 기존 데이터를 바꾸고, DELETE로 행을 지울 수 있어요.WHERE를 빠뜨리면 테이블 전체가 바뀌는 대형 사고를 피할 수 있어요.DML(Data Manipulation Language, 데이터 조작어)은 테이블 안의 데이터 자체를 바꾸는 명령어들이에요. 크게 세 가지 — 넣기(INSERT)·바꾸기(UPDATE)·지우기(DELETE) — 가 있어요.
| 명령어 | 하는 일 | 한 문장으로 |
|---|---|---|
INSERT | 새 행을 넣기 | "이 데이터를 추가해줘" |
UPDATE | 기존 값 바꾸기 | "이 행의 값을 이걸로 바꿔줘" |
DELETE | 행 지우기 | "이 행을 지워줘" |
WHERE가 대상을 정한다." 이 한 문장만 잡고 가면 됩니다.새 행을 넣을 때는 INSERT INTO 뒤에 테이블 이름과 열 목록을, VALUES 뒤에 넣을 값을 적어요.
INSERT INTO users (name, age) -- ① 어느 테이블의 어느 열에
VALUES ('철수', 20); -- ② 어떤 값을 (name='철수', age=20)
| id | name | age |
|---|---|---|
| 1 | '영희' | 25 |
| 2 | '민수' | 30 |
| 3 | '철수' | 20 |
(name, age)와 값 목록 ('철수', 20)은 순서대로 짝이 돼요 — name에 '철수', age에 20.' ')로, 숫자는 그냥 적어요.
⚠️ 열 2개인데 값 1개(또는 3개)를 주면 오류가 나요. "열 개수 = 값 개수"를 항상 확인!
여러 행을 한 번에 넣을 수도 있어요. VALUES 뒤에 괄호 묶음을 콤마로 이어 붙이면 돼요.
INSERT INTO users (name, age)
VALUES ('철수', 20),
('영수', 22),
('지민', 19); -- 세 행을 한 번에 삽입
INSERT INTO users VALUES (...) 처럼 쓸 수도 있지만, 그러면 테이블의 모든 열에 순서대로 값을 다 채워야 해요. 실무에서는 열 목록을 명시하는 편이 안전하고 읽기도 좋아요.SET으로 바꿀 값, WHERE로 바꿀 대상을 정해요.이미 있는 데이터를 수정할 때는 UPDATE를 써요. SET에 어떤 열을 어떤 값으로 바꿀지, WHERE에 어떤 행을 바꿀지 적어요.
UPDATE users
SET age = 21 -- ① age 열을 21로 바꿔라
WHERE id = 1; -- ② 단, id가 1인 행만
| id | name | age |
|---|---|---|
| 1 | '철수' | 21 |
| 2 | '영희' | 25 |
| 3 | '민수' | 30 |
SET 뒤에 콤마로 이어 여러 열을 동시에 바꿀 수 있어요.SET age = 21, name = '철이' → 나이와 이름을 함께 수정.
💡 값을 계산해서 넣을 수도 있어요 — SET age = age + 1 처럼 "현재 나이 + 1"로 바꾸는 것도 가능해요.
WHERE id = 1이면 id가 1인 행만 바뀌어요. 이 조건을 어떻게 쓰느냐가 다음 섹션에서 가장 중요한 이야기가 됩니다.UPDATE와 DELETE는 WHERE로 대상을 좁히지 않으면, 테이블의 모든 행에 적용돼요. 실수로 WHERE를 빼면 전체 데이터가 한꺼번에 수정·삭제되는 거죠.
-- ❌ 위험! WHERE가 없다
UPDATE users SET age = 0; -- 모든 사람의 나이가 0이 됨!!
-- ✅ 안전. 대상을 콕 집었다
UPDATE users SET age = 0 WHERE id = 1;
| id | name | age |
|---|---|---|
| 1 | '철수' | 0 |
| 2 | '영희' | 0 |
| 3 | '민수' | 0 |
WHERE를 빠뜨린 UPDATE·DELETE는 테이블 전체를 날려버리는 사고로 이어져요. 실제로 회사에서 수십만 건이 한 줄로 지워지는 일이 종종 벌어집니다.WHERE를 먼저 쓰고 SET/DELETE를 나중에 완성하기, ② 실행 전에 같은 조건으로 SELECT 해서 몇 행이 걸리는지 확인하기, ③ 중요한 작업 전 백업 확인하기.SELECT * FROM users WHERE id = 1; → 딱 그 행만 나오면 안전한 조건이라는 뜻이에요.
💡 SELECT는 아무리 실행해도 데이터가 안 바뀌니까, "리허설"로 안성맞춤이에요.
DELETE는 테이블에서 행(데이터)을 지워요. UPDATE와 마찬가지로 WHERE로 지울 대상을 정해요.
DELETE FROM users
WHERE id = 3; -- id가 3인 행만 삭제
| id | name | age |
|---|---|---|
| 1 | '철수' | 20 |
| 2 | '영희' | 25 |
| 3 | '민수' | 30 |
WHERE 없는 DELETE FROM users;는 모든 행을 삭제해요. 테이블 껍데기(구조)는 남지만 안의 데이터는 전부 사라져요. 앞 섹션의 확인 습관을 꼭 지키세요.DELETE — 테이블 안의 행(데이터)을 지워요. 테이블 자체는 그대로 남아요.DROP — 테이블 자체(구조까지 통째로)를 없애요. 테이블이 아예 사라져요.
💡 즉 DELETE는 "표 안의 줄을 지우기", DROP은 "표 자체를 없애기". DROP은 DDL이고, 다음 CH 09에서 다뤄요.
많은 DB 도구는 실수 방지를 위해 "안전 모드(safe update)"를 제공해요. 예를 들어 MySQL Workbench에는 WHERE 없는 UPDATE·DELETE를 아예 막아주는 옵션이 있어요. 또 변경 작업을 트랜잭션(BEGIN … COMMIT/ROLLBACK)으로 감싸면, 잘못됐을 때 ROLLBACK으로 되돌릴 수도 있어요. (트랜잭션은 이후 심화 주제예요.)
ROLLBACK으로 실행 전 상태로 되돌릴 수 있어서, WHERE 실수 같은 사고를 막는 안전장치가 돼요. (자세한 원리는 CH 10에서 배워요.)