Skip to main content
Summary

데이터를 바꾸는 SQL은 더 신중해야 합니다

앞 장까지는 주로 데이터를 읽었습니다. SELECT는 테이블에 저장된 데이터를 조회할 뿐, 값을 바꾸지는 않습니다.

이번 장부터는 데이터를 직접 변경합니다.

  • INSERT: 새 행을 추가합니다.

  • UPDATE: 기존 행의 값을 수정합니다.

  • DELETE: 기존 행을 삭제합니다.

  • TRUNCATE: 테이블의 모든 행을 빠르게 비웁니다.

이 문장들은 강력합니다. 원하는 데이터를 빠르게 바꿀 수 있지만, 조건을 잘못 쓰면 많은 데이터가 한 번에 바뀌거나 삭제될 수 있습니다.

따라서 이번 장의 핵심은 문법만 외우는 것이 아닙니다. 변경하기 전에 반드시 대상을 확인하는 습관을 익히는 것입니다.

먼저 실습 데이터베이스를 선택합니다.

USE mysql_book;

현재 students 테이블에 어떤 데이터가 있는지 확인합니다.

SELECT *
FROM students;

테이블 구조도 함께 확인해 둡니다.

DESC students;

이 장에서는 이전에 만든 students 테이블을 기준으로 설명합니다.

CREATE TABLE students (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  email VARCHAR(100),
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

핵심 열은 다음과 같습니다.

열의미
id학생 번호, 자동 증가
name학생 이름, 반드시 입력
email이메일, 비워 둘 수 있음
created_at생성 시각, 기본값 자동 입력

테이블 구조가 조금 다르더라도 괜찮습니다. 자신의 테이블에 맞게 열 이름만 바꾸어 실행하면 됩니다.


데이터 추가, 수정, 삭제 다루기

INSERT로 한 행 추가하기

INSERT는 테이블에 새 행을 추가할 때 사용합니다.

기본 형태는 다음과 같습니다.

INSERT INTO 테이블이름 (열1, 열2)
VALUES (값1, 값2);

예를 들어 students 테이블에 학생 한 명을 추가해 보겠습니다.

INSERT INTO students (name, email)
VALUES ('박지훈', '[email protected]');

이 문장은 다음 뜻입니다.

  1. students 테이블에

  2. name, email 값을 넣고

  3. 새 행 하나를 추가합니다.

추가된 데이터를 확인합니다.

SELECT *
FROM students
ORDER BY id DESC;

여기서 id와 created_at은 직접 입력하지 않았습니다. 그래도 값이 들어갑니다.

  • id는 AUTO_INCREMENT 때문에 자동으로 증가합니다.

  • created_at은 DEFAULT CURRENT_TIMESTAMP 때문에 현재 시각이 자동으로 들어갑니다.

이처럼 INSERT할 때 모든 열을 직접 입력해야 하는 것은 아닙니다. 자동 증가 열이나 기본값이 있는 열은 생략할 수 있습니다.


기본값과 NULL이 적용되는 방식 이해하기

INSERT에서 열을 생략하면 MySQL은 그 열에 넣을 값을 규칙에 따라 결정합니다.

상황결과
기본값이 있는 열을 생략기본값이 들어감
AUTO_INCREMENT 열을 생략다음 번호가 자동 입력됨
NULL을 허용하는 열을 생략NULL이 들어갈 수 있음
NOT NULL인데 기본값이 없는 열을 생략오류 발생

예를 들어 email은 비워 둘 수 있는 열입니다. 다음 문장은 이름만 입력합니다.

INSERT INTO students (name)
VALUES ('이서연');

결과를 확인합니다.

SELECT id, name, email, created_at
FROM students
WHERE name = '이서연';

email에는 값이 없으므로 NULL이 들어갈 수 있습니다. NULL은 빈 문자열이 아니라 값이 없음을 뜻합니다.

반대로 name은 NOT NULL입니다. 따라서 이름 없이 추가하려고 하면 오류가 납니다.

INSERT INTO students (email)
VALUES ('[email protected]');

이 문장은 실행되지 않습니다. name은 반드시 필요한 값이기 때문입니다.

기본값을 명시적으로 사용하고 싶다면 DEFAULT를 쓸 수도 있습니다.

INSERT INTO students (name, email, created_at)
VALUES ('최유진', '[email protected]', DEFAULT);

이 문장에서 created_at은 직접 날짜를 입력하지 않고 기본값을 사용합니다.


여러 행을 한 번에 추가하기

여러 행을 추가할 때 INSERT를 여러 번 실행할 수도 있습니다.

INSERT INTO students (name, email)
VALUES ('김하늘', '[email protected]');

INSERT INTO students (name, email)
VALUES ('정도윤', '[email protected]');

하지만 같은 테이블에 여러 행을 넣는다면 한 문장으로 작성할 수 있습니다.

INSERT INTO students (name, email)
VALUES
  ('한소라', '[email protected]'),
  ('오민재', '[email protected]'),
  ('윤지아', '[email protected]');

이 문장은 세 행을 한 번에 추가합니다.

확인해 봅니다.

SELECT id, name, email, created_at
FROM students
ORDER BY id DESC
LIMIT 5;

여러 행을 한 번에 추가하면 문장이 짧아지고 실행 횟수도 줄어듭니다. 실무에서 초기 데이터를 넣거나 테스트 데이터를 만들 때 자주 사용합니다.

다만 값의 순서가 열 목록과 정확히 맞아야 합니다.

INSERT INTO students (name, email)
VALUES ('강민호', '[email protected]');

위 문장에서 첫 번째 값은 name에, 두 번째 값은 email에 들어갑니다. 열 순서와 값 순서가 다르면 잘못된 데이터가 저장될 수 있습니다.

그래서 INSERT를 쓸 때는 열 이름을 생략하지 않는 습관이 좋습니다.


UPDATE로 기존 데이터 수정하기

UPDATE는 이미 저장된 행의 값을 바꿀 때 사용합니다.

기본 형태는 다음과 같습니다.

UPDATE 테이블이름
SET 열이름 = 새값
WHERE 조건;

예를 들어 id가 1인 학생의 이메일을 수정해 보겠습니다.

먼저 수정할 대상을 조회합니다.

SELECT id, name, email
FROM students
WHERE id = 1;

대상이 맞다면 수정합니다.

UPDATE students
SET email = '[email protected]'
WHERE id = 1;

수정 결과를 다시 확인합니다.

SELECT id, name, email
FROM students
WHERE id = 1;

여러 열을 한 번에 수정할 수도 있습니다.

UPDATE students
SET name = '김민수',
    email = '[email protected]'
WHERE id = 1;

SET 뒤에 바꿀 열과 값을 적습니다. 여러 열을 수정할 때는 쉼표로 구분합니다.


UPDATE에서 WHERE를 빠뜨리면 모든 행이 바뀝니다

UPDATE에서 가장 위험한 실수는 WHERE를 빠뜨리는 것입니다.

다음 문장을 보겠습니다.

UPDATE students
SET email = NULL;

이 문장은 특정 학생 한 명의 이메일만 지우는 문장이 아닙니다. WHERE 조건이 없기 때문에 students 테이블의 모든 행에서 email을 NULL로 바꿉니다.

데이터가 5행이면 5행이 바뀌고, 100만 행이면 100만 행이 바뀝니다.

그래서 UPDATE를 실행하기 전에는 다음 순서를 지키는 것이 좋습니다.

1. 먼저 SELECT로 대상 확인하기

SELECT id, name, email
FROM students
WHERE id = 3;

2. 결과가 맞는지 확인하기

조회 결과가 정확히 수정하려는 행인지 봅니다. 한 행만 수정하려는 상황인데 여러 행이 나오면 조건이 넓은 것입니다.

3. 같은 WHERE 조건으로 UPDATE 실행하기

UPDATE students
SET email = '[email protected]'
WHERE id = 3;

4. 다시 SELECT로 결과 확인하기

SELECT id, name, email
FROM students
WHERE id = 3;

처음에는 이 과정이 번거롭게 느껴질 수 있습니다. 하지만 데이터 변경 작업에서는 빠른 실행보다 정확한 실행이 더 중요합니다.

특히 다음과 같은 조건은 조심해야 합니다.

WHERE name = '김민수'

이름은 중복될 수 있습니다. 같은 이름의 학생이 여러 명이면 모두 수정됩니다.

가능하면 기본키인 id처럼 한 행을 정확히 가리키는 값을 조건으로 사용하는 것이 안전합니다.


DELETE로 행 삭제하기

DELETE는 테이블에서 행을 삭제할 때 사용합니다.

기본 형태는 다음과 같습니다.

DELETE FROM 테이블이름
WHERE 조건;

예를 들어 id가 5인 학생을 삭제한다고 가정하겠습니다.

먼저 삭제할 대상을 확인합니다.

SELECT id, name, email
FROM students
WHERE id = 5;

정말 삭제해도 되는 행인지 확인한 뒤 실행합니다.

DELETE FROM students
WHERE id = 5;

삭제되었는지 다시 확인합니다.

SELECT id, name, email
FROM students
WHERE id = 5;

결과가 나오지 않으면 삭제된 것입니다.

DELETE도 UPDATE와 마찬가지로 WHERE가 매우 중요합니다.

DELETE FROM students;

이 문장은 students 테이블의 모든 행을 삭제합니다. 테이블 자체가 없어지는 것은 아니지만, 안에 있던 데이터는 모두 사라집니다.

따라서 DELETE를 실행하기 전에도 항상 같은 조건으로 SELECT를 먼저 실행해야 합니다.

SELECT id, name, email
FROM students
WHERE email IS NULL;

위 결과를 보고 이메일이 없는 학생을 삭제해도 된다고 판단했다면 그때 다음처럼 실행합니다.

DELETE FROM students
WHERE email IS NULL;

조건 하나가 삭제 범위를 결정합니다. 조건이 정확하지 않으면 삭제 결과도 정확하지 않습니다.


DELETE와 TRUNCATE의 차이

테이블의 데이터를 모두 지우는 방법은 크게 두 가지가 있습니다.

DELETE FROM students;
TRUNCATE TABLE students;

둘 다 결과적으로 테이블 안의 행을 비울 수 있습니다. 하지만 동작 방식과 위험도가 다릅니다.

구분DELETETRUNCATE
조건 사용WHERE 사용 가능WHERE 사용 불가
삭제 범위일부 또는 전체 행항상 전체 행
실행 성격데이터 변경 문장테이블을 빠르게 비우는 문장
자동 증가 번호보통 유지됨보통 초기화됨
되돌리기트랜잭션 안에서는 되돌릴 수 있음일반적으로 되돌리기 어려움

DELETE는 행을 삭제하는 문장입니다. 조건을 붙이면 일부 행만 삭제할 수 있습니다.

DELETE FROM students
WHERE id = 10;

반면 TRUNCATE는 조건을 붙일 수 없습니다.

TRUNCATE TABLE students;

이 문장은 students 테이블의 모든 데이터를 비웁니다. 특정 행만 지우는 용도로는 사용할 수 없습니다.

또 하나 중요한 차이는 복구 가능성입니다. DELETE는 트랜잭션이라는 작업 묶음 안에서 실행하면 확정하기 전까지 되돌릴 수 있습니다. 트랜잭션은 뒤에서 자세히 다루지만, 지금은 "여러 작업을 하나로 묶고, 필요하면 취소할 수 있게 하는 기능" 정도로 이해하면 됩니다.

반면 TRUNCATE는 MySQL에서 보통 즉시 확정되는 방식으로 처리됩니다. 그래서 실수로 실행하면 단순히 ROLLBACK으로 되돌리기 어렵습니다. 백업이 없다면 복구가 매우 곤란할 수 있습니다.

또한 TRUNCATE는 AUTO_INCREMENT 번호를 다시 시작하게 만들 수 있습니다. 예를 들어 데이터가 모두 지워진 뒤 새 학생을 추가하면 id가 다시 1부터 시작할 수 있습니다.

학습 중에는 TRUNCATE를 함부로 실행하지 마세요. 실습 데이터를 모두 지워도 되는 상황에서만 사용해야 합니다.


변경 전 SELECT로 확인하는 안전한 절차

데이터를 변경할 때는 다음 절차를 습관으로 만들어야 합니다.

1. 현재 데이터베이스 확인

먼저 내가 어느 데이터베이스에서 작업 중인지 확인합니다.

SELECT DATABASE();

원하는 데이터베이스가 아니라면 선택합니다.

USE mysql_book;

데이터베이스를 잘못 선택한 상태에서 UPDATE나 DELETE를 실행하면 전혀 다른 데이터가 바뀔 수 있습니다.

2. SELECT로 대상 행 확인

수정하거나 삭제하려는 조건으로 먼저 조회합니다.

SELECT id, name, email
FROM students
WHERE id = 2;

결과가 예상과 맞는지 확인합니다.

3. 변경될 행 수 예상

여러 행을 바꾸는 작업이라면 개수를 먼저 확인합니다.

SELECT COUNT(*) AS target_count
FROM students
WHERE email IS NULL;

예상보다 많은 수가 나오면 변경 문장을 실행하지 말고 조건을 다시 점검해야 합니다.

4. 같은 WHERE 조건으로 변경 실행

조회에 사용한 조건을 그대로 사용합니다.

UPDATE students
SET email = '[email protected]'
WHERE email IS NULL;

삭제도 마찬가지입니다.

DELETE FROM students
WHERE email IS NULL;

5. 변경 후 다시 확인

작업 후에는 반드시 결과를 확인합니다.

SELECT id, name, email
FROM students
WHERE email = '[email protected]';

이 다섯 단계는 단순하지만 효과적입니다.

확인하고, 바꾸고, 다시 확인한다.

데이터 변경 작업의 기본 원칙입니다.


실습 예제: 안전하게 수정하기

다음 예제는 학생 한 명의 이메일을 수정하는 전체 흐름입니다.

먼저 학생을 하나 추가합니다.

INSERT INTO students (name, email)
VALUES ('테스트학생', '[email protected]');

방금 추가한 학생을 확인합니다.

SELECT id, name, email
FROM students
WHERE name = '테스트학생';

결과에서 id 값을 확인합니다. 예를 들어 id가 8이라고 가정하겠습니다.

수정 전 다시 한 번 정확히 조회합니다.

SELECT id, name, email
FROM students
WHERE id = 8;

이제 이메일을 수정합니다.

UPDATE students
SET email = '[email protected]'
WHERE id = 8;

수정 결과를 확인합니다.

SELECT id, name, email
FROM students
WHERE id = 8;

이 흐름에서 중요한 점은 UPDATE를 바로 실행하지 않았다는 것입니다. 먼저 SELECT로 대상을 확인했고, 그 조건을 그대로 사용했습니다.


실습 예제: 안전하게 삭제하기

이번에는 방금 만든 테스트 학생을 삭제해 보겠습니다.

먼저 삭제 대상을 확인합니다.

SELECT id, name, email
FROM students
WHERE name = '테스트학생';

만약 결과가 여러 행이라면 바로 삭제하지 마세요. 삭제할 정확한 id를 확인해야 합니다.

예를 들어 삭제할 학생의 id가 8이라면 다음처럼 다시 조회합니다.

SELECT id, name, email
FROM students
WHERE id = 8;

정확히 한 행만 나오면 삭제합니다.

DELETE FROM students
WHERE id = 8;

삭제 후 다시 조회합니다.

SELECT id, name, email
FROM students
WHERE id = 8;

결과가 나오지 않으면 삭제가 완료된 것입니다.

삭제할 때도 핵심은 같습니다. DELETE보다 SELECT를 먼저 작성하세요.


직접 연습해 보기

아래 실습은 직접 실행해 보면서 결과를 확인해 보세요.

1. 학생 세 명 추가하기

INSERT INTO students (name, email)
VALUES
  ('연습학생1', '[email protected]'),
  ('연습학생2', '[email protected]'),
  ('연습학생3', NULL);

2. 추가된 학생 조회하기

SELECT id, name, email
FROM students
WHERE name LIKE '연습학생%'
ORDER BY id;

3. 이메일이 없는 학생 확인하기

SELECT id, name, email
FROM students
WHERE email IS NULL;

4. 특정 학생 이메일 수정하기

먼저 수정할 학생의 id를 확인한 뒤 실행합니다.

UPDATE students
SET email = '[email protected]'
WHERE name = '연습학생3';

실무에서는 이름보다 id 조건을 사용하는 편이 더 안전합니다. 위 문장을 실행하기 전, 같은 조건의 SELECT 결과가 정확한지 반드시 확인하세요.

5. 연습 데이터 삭제하기

삭제 전 확인합니다.

SELECT id, name, email
FROM students
WHERE name LIKE '연습학생%';

확인 후 삭제합니다.

DELETE FROM students
WHERE name LIKE '연습학생%';

삭제 후 다시 확인합니다.

SELECT id, name, email
FROM students
WHERE name LIKE '연습학생%';

TRUNCATE TABLE students;는 이 실습에서 실행하지 마세요. 테이블의 모든 데이터가 사라질 수 있습니다.


핵심 정리

INSERT, UPDATE, DELETE는 데이터를 직접 바꾸는 문장입니다.

  • INSERT는 새 행을 추가합니다.

  • INSERT에서 자동 증가 열과 기본값이 있는 열은 생략할 수 있습니다.

  • 여러 행은 VALUES를 여러 묶음으로 작성해 한 번에 추가할 수 있습니다.

  • UPDATE는 기존 행의 값을 수정합니다.

  • UPDATE에서 WHERE를 빠뜨리면 모든 행이 수정될 수 있습니다.

  • DELETE는 조건에 맞는 행을 삭제합니다.

  • DELETE에서 WHERE를 빠뜨리면 모든 행이 삭제될 수 있습니다.

  • TRUNCATE는 테이블의 모든 행을 빠르게 비우며, 조건을 사용할 수 없습니다.

  • TRUNCATE는 일반적으로 되돌리기 어렵고 자동 증가 번호가 초기화될 수 있으므로 신중하게 사용해야 합니다.

  • 변경 작업 전에는 반드시 같은 조건으로 SELECT를 먼저 실행해야 합니다.

데이터 변경의 기본 원칙은 간단합니다.

바꾸기 전에 확인하고, 바꾼 뒤에 다시 확인합니다.

이 습관이 있어야 MySQL을 안전하게 다룰 수 있습니다. 다음 장에서는 테이블을 더 잘 설계하기 위해 데이터 타입을 선택하고 테이블 구조를 만드는 방법을 배웁니다.

책 목록

처음부터 실무까지 배우는 MySQL

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기