데이터베이스 개념노트 12편 - INSERT, UPDATE, DELETE
지난 글에서는 여러 테이블을 연결해서 데이터를 조회하는 JOIN에 대해 정리했습니다.
이번 글에서는 데이터를 조회하는 SELECT문에서 한 단계 더 나아가, 데이터를 직접 추가, 수정, 삭제하는 SQL 문법인 INSERT, UPDATE, DELETE에 대해 정리해 보겠습니다.
이 세 가지는 데이터 조작어, 즉 DML(Data Manipulation Language)에 해당합니다. SQLD에서도 DML의 기본 문법과 주의사항은 자주 등장하므로 확실히 정리해 두는 것이 좋습니다.
1. DML이란?
DML은 Data Manipulation Language의 약자로, 데이터베이스에 저장된 데이터를 조작하는 SQL 명령어입니다.
DML은 테이블에 저장된 데이터를 조회, 입력, 수정, 삭제하는 명령어이다.
대표적인 DML은 다음과 같습니다.
| 명령어 | 역할 |
|---|---|
| SELECT | 데이터 조회 |
| INSERT | 데이터 입력 |
| UPDATE | 데이터 수정 |
| DELETE | 데이터 삭제 |
SELECT는 데이터를 조회하는 명령어이고, INSERT, UPDATE, DELETE는 실제 테이블의 데이터를 변경하는 명령어입니다.
2. 예제 테이블
이번 글에서는 다음 회원 테이블을 기준으로 예제를 살펴보겠습니다.
CREATE TABLE 회원 (
회원번호 NUMBER PRIMARY KEY,
이름 VARCHAR2(50) NOT NULL,
이메일 VARCHAR2(100) UNIQUE,
회원등급 VARCHAR2(10) DEFAULT '일반',
가입일 DATE DEFAULT SYSDATE
);
회원 테이블의 구조는 다음과 같습니다.
| 컬럼명 | 설명 | 제약조건 |
|---|---|---|
| 회원번호 | 회원을 구분하는 번호 | PRIMARY KEY |
| 이름 | 회원 이름 | NOT NULL |
| 이메일 | 회원 이메일 | UNIQUE |
| 회원등급 | 회원 등급 | DEFAULT '일반' |
| 가입일 | 회원 가입 날짜 | DEFAULT SYSDATE |
3. INSERT문이란?
INSERT는 테이블에 새로운 행을 추가할 때 사용하는 SQL문입니다.
INSERT는 테이블에 새로운 데이터를 입력하는 명령어이다.
기본 구조는 다음과 같습니다.
INSERT INTO 테이블명 (컬럼1, 컬럼2, 컬럼3)
VALUES (값1, 값2, 값3);
INSERT문에서는 입력할 컬럼과 그에 대응되는 값을 지정합니다. 컬럼의 순서와 값의 순서가 일치해야 합니다.
4. 컬럼명을 지정해서 INSERT하기
회원 테이블에 새로운 회원을 추가해 보겠습니다.
INSERT INTO 회원 (회원번호, 이름, 이메일, 회원등급, 가입일)
VALUES (1001, '김지훈', 'jihoon@example.com', '골드', TO_DATE('2026-01-10', 'YYYY-MM-DD'));
위 SQL은 회원번호가 1001인 김지훈 회원을 회원 테이블에 추가합니다.
| 회원번호 | 이름 | 이메일 | 회원등급 | 가입일 |
|---|---|---|---|---|
| 1001 | 김지훈 | jihoon@example.com | 골드 | 2026-01-10 |
5. 컬럼명을 생략해서 INSERT하기
INSERT문에서는 컬럼명을 생략할 수도 있습니다. 하지만 이 경우 테이블에 정의된 컬럼 순서대로 모든 값을 입력해야 합니다.
INSERT INTO 회원
VALUES (1002, '이수진', 'sujin@example.com', '실버', TO_DATE('2026-01-15', 'YYYY-MM-DD'));
컬럼명을 생략하면 짧게 작성할 수 있지만, 테이블 구조가 변경되었을 때 오류가 발생하거나 의도하지 않은 값이 들어갈 수 있습니다.
따라서 실무에서는 컬럼명을 명시하는 방식이 더 안전합니다.
INSERT문에서는 컬럼명을 명시하는 습관을 들이는 것이 좋습니다.
6. 일부 컬럼만 INSERT하기
모든 컬럼에 값을 넣지 않고 일부 컬럼에만 값을 넣을 수도 있습니다.
INSERT INTO 회원 (회원번호, 이름, 이메일)
VALUES (1003, '박민수', 'minsu@example.com');
위 SQL은 회원번호, 이름, 이메일만 입력합니다. 회원등급과 가입일은 DEFAULT 값이 설정되어 있으므로 자동으로 값이 들어갈 수 있습니다.
| 컬럼 | 입력 여부 | 결과 |
|---|---|---|
| 회원번호 | 입력 | 1003 |
| 이름 | 입력 | 박민수 |
| 이메일 | 입력 | minsu@example.com |
| 회원등급 | 생략 | 기본값 '일반' |
| 가입일 | 생략 | 기본값 SYSDATE |
7. NULL 입력하기
컬럼에 값을 넣지 않고 NULL을 입력할 수도 있습니다. 다만 NOT NULL 제약조건이 있는 컬럼에는 NULL을 입력할 수 없습니다.
INSERT INTO 회원 (회원번호, 이름, 이메일, 회원등급)
VALUES (1004, '최유진', NULL, '골드');
위 SQL은 이메일 컬럼에 NULL을 입력합니다. 이메일 컬럼이 NULL을 허용한다면 정상적으로 입력될 수 있습니다.
하지만 이름 컬럼은 NOT NULL 제약조건이 있으므로 다음 SQL은 오류가 발생합니다.
INSERT INTO 회원 (회원번호, 이름, 이메일)
VALUES (1005, NULL, 'test@example.com');
NOT NULL 컬럼에는 반드시 값이 있어야 합니다.
8. DEFAULT 값 사용하기
DEFAULT 값이 설정된 컬럼은 값을 생략하거나 DEFAULT 키워드를 사용해 기본값을 입력할 수 있습니다.
INSERT INTO 회원 (회원번호, 이름, 이메일, 회원등급, 가입일)
VALUES (1006, '정하늘', 'haneul@example.com', DEFAULT, DEFAULT);
위 SQL에서 회원등급과 가입일은 DEFAULT 값을 사용합니다. 회원등급은 '일반', 가입일은 현재 날짜가 들어갈 수 있습니다.
9. INSERT SELECT
INSERT문은 직접 값을 입력하는 방식뿐만 아니라, SELECT 결과를 이용해 데이터를 입력할 수도 있습니다. 이를 INSERT SELECT라고 합니다.
INSERT INTO 우수회원 (회원번호, 이름, 이메일)
SELECT 회원번호, 이름, 이메일
FROM 회원
WHERE 회원등급 = '골드';
위 SQL은 회원 테이블에서 회원등급이 골드인 회원을 조회한 뒤, 그 결과를 우수회원 테이블에 입력합니다.
INSERT SELECT를 사용할 때는 INSERT 대상 컬럼 수와 SELECT 결과 컬럼 수가 일치해야 합니다. 또한 각 컬럼의 데이터 타입도 맞아야 합니다.
10. 여러 행 입력하기
DBMS에 따라 여러 행을 한 번에 입력하는 문법이 다를 수 있습니다. Oracle에서는 INSERT ALL 문을 사용할 수 있습니다.
INSERT ALL
INTO 회원 (회원번호, 이름, 이메일) VALUES (1007, '강민재', 'minjae@example.com')
INTO 회원 (회원번호, 이름, 이메일) VALUES (1008, '윤서연', 'seoyeon@example.com')
SELECT *
FROM DUAL;
Oracle에서는 DUAL이라는 특수 테이블을 이용해 여러 행 입력을 처리할 수 있습니다. 다른 DBMS에서는 다음과 같은 다중 VALUES 문법을 지원하기도 합니다.
INSERT INTO 회원 (회원번호, 이름, 이메일)
VALUES
(1007, '강민재', 'minjae@example.com'),
(1008, '윤서연', 'seoyeon@example.com');
SQLD는 Oracle 기준 문법이 자주 등장하므로, Oracle의 INSERT ALL 형태도 알아두면 좋습니다.
11. INSERT 시 주의사항
INSERT문을 사용할 때는 다음 사항을 주의해야 합니다.
- 컬럼 수와 값의 수가 일치해야 한다.
- 컬럼의 데이터 타입과 입력 값의 데이터 타입이 맞아야 한다.
- PRIMARY KEY 컬럼에는 중복 값을 입력할 수 없다.
- NOT NULL 컬럼에는 NULL을 입력할 수 없다.
- UNIQUE 컬럼에는 중복 값을 입력할 수 없다.
- FOREIGN KEY 컬럼에는 참조 대상 테이블에 존재하는 값만 입력해야 한다.
제약조건을 위반하면 INSERT문은 실패합니다.
12. UPDATE문이란?
UPDATE는 테이블에 저장된 기존 데이터를 수정할 때 사용하는 SQL문입니다.
UPDATE는 테이블에 이미 존재하는 데이터를 변경하는 명령어이다.
기본 구조는 다음과 같습니다.
UPDATE 테이블명
SET 컬럼명 = 변경할값
WHERE 조건;
UPDATE문에서 WHERE절은 매우 중요합니다. WHERE절이 없으면 테이블의 모든 행이 수정될 수 있습니다.
13. 특정 행 수정하기
회원번호가 1001인 회원의 회원등급을 VIP로 변경해 보겠습니다.
UPDATE 회원
SET 회원등급 = 'VIP'
WHERE 회원번호 = 1001;
위 SQL은 회원번호가 1001인 행만 찾아서 회원등급을 VIP로 수정합니다.
| 수정 전 | 수정 후 |
|---|---|
| 회원등급 = 골드 | 회원등급 = VIP |
14. 여러 컬럼 한 번에 수정하기
UPDATE문에서는 여러 컬럼을 한 번에 수정할 수 있습니다.
UPDATE 회원
SET 이메일 = 'newjihoon@example.com',
회원등급 = 'VIP'
WHERE 회원번호 = 1001;
위 SQL은 회원번호가 1001인 회원의 이메일과 회원등급을 함께 수정합니다.
SET절에서 여러 컬럼을 수정할 때는 쉼표로 구분합니다.
15. 조건에 맞는 여러 행 수정하기
WHERE 조건에 맞는 행이 여러 개라면 여러 행이 한 번에 수정됩니다.
UPDATE 회원
SET 회원등급 = '우수'
WHERE 회원등급 = '골드';
위 SQL은 회원등급이 골드인 모든 회원의 등급을 우수로 변경합니다.
UPDATE문은 조건에 맞는 모든 행을 수정하므로, 수정 전에 SELECT문으로 대상 데이터를 먼저 확인하는 것이 좋습니다.
SELECT *
FROM 회원
WHERE 회원등급 = '골드';
16. 계산식을 이용한 UPDATE
UPDATE문에서는 기존 컬럼 값을 이용해 새로운 값을 계산할 수 있습니다.
예를 들어 상품 테이블에서 모든 상품 가격을 10% 인상한다고 해보겠습니다.
UPDATE 상품
SET 상품가격 = 상품가격 * 1.1;
위 SQL은 상품 테이블의 모든 상품 가격을 10% 증가시킵니다. WHERE절이 없으므로 모든 행이 수정됩니다.
특정 카테고리 상품만 가격을 인상하려면 WHERE절을 사용해야 합니다.
UPDATE 상품
SET 상품가격 = 상품가격 * 1.1
WHERE 카테고리 = '전자기기';
17. 서브쿼리를 이용한 UPDATE
UPDATE문에서는 서브쿼리를 사용해 다른 테이블의 값을 참조할 수 있습니다.
예를 들어 회원 테이블의 총주문금액 컬럼을 주문 테이블의 합계로 갱신한다고 가정해 보겠습니다.
UPDATE 회원 M
SET 총주문금액 = (
SELECT SUM(O.주문금액)
FROM 주문 O
WHERE O.회원번호 = M.회원번호
);
위 SQL은 각 회원별 주문금액 합계를 계산해서 회원 테이블의 총주문금액에 반영합니다.
서브쿼리를 이용한 UPDATE는 강력하지만, 대상 행과 서브쿼리 결과의 관계를 정확히 이해하고 사용해야 합니다.
18. UPDATE에서 WHERE절이 없는 경우
UPDATE문에서 WHERE절을 생략하면 테이블의 모든 행이 수정됩니다.
UPDATE 회원
SET 회원등급 = '일반';
위 SQL은 모든 회원의 회원등급을 일반으로 바꿉니다. 의도한 경우라면 문제가 없지만, 실수라면 매우 위험합니다.
UPDATE와 DELETE를 실행하기 전에는 WHERE절을 반드시 확인해야 합니다.
19. DELETE문이란?
DELETE는 테이블에 저장된 행을 삭제할 때 사용하는 SQL문입니다.
DELETE는 테이블에서 조건에 맞는 행을 삭제하는 명령어이다.
기본 구조는 다음과 같습니다.
DELETE FROM 테이블명
WHERE 조건;
DELETE도 UPDATE와 마찬가지로 WHERE절이 매우 중요합니다. WHERE절이 없으면 테이블의 모든 행이 삭제될 수 있습니다.
20. 특정 행 삭제하기
회원번호가 1008인 회원을 삭제해 보겠습니다.
DELETE FROM 회원
WHERE 회원번호 = 1008;
위 SQL은 회원번호가 1008인 회원 데이터만 삭제합니다.
삭제 전에는 SELECT문으로 삭제 대상을 먼저 확인하는 것이 안전합니다.
SELECT *
FROM 회원
WHERE 회원번호 = 1008;
21. 조건에 맞는 여러 행 삭제하기
조건에 맞는 여러 행을 한 번에 삭제할 수도 있습니다.
DELETE FROM 회원
WHERE 회원등급 = '탈퇴';
위 SQL은 회원등급이 탈퇴인 모든 회원 데이터를 삭제합니다.
DELETE문은 조건에 맞는 행 전체를 삭제하므로, 조건을 정확하게 작성해야 합니다.
22. WHERE절 없이 DELETE하기
DELETE문에서 WHERE절을 생략하면 테이블의 모든 행이 삭제됩니다.
DELETE FROM 회원;
위 SQL은 회원 테이블의 모든 데이터를 삭제합니다. 하지만 테이블 구조 자체는 남아 있습니다.
| 삭제 대상 | 결과 |
|---|---|
| 데이터 행 | 삭제됨 |
| 테이블 구조 | 유지됨 |
23. DELETE와 참조 무결성
다른 테이블에서 참조하고 있는 데이터를 삭제하려고 하면 제약조건 오류가 발생할 수 있습니다.
예를 들어 주문 테이블이 회원 테이블의 회원번호를 외래키로 참조하고 있다고 가정해 보겠습니다.
회원
- 회원번호 PK
주문
- 주문번호 PK
- 회원번호 FK
주문이 존재하는 회원을 회원 테이블에서 삭제하려고 하면 참조 무결성 때문에 삭제가 제한될 수 있습니다.
DELETE FROM 회원
WHERE 회원번호 = 1001;
만약 주문 테이블에 회원번호 1001의 주문이 존재한다면, DBMS는 부모 데이터 삭제를 막을 수 있습니다.
이럴 때는 관련 주문 데이터를 먼저 처리하거나, 외래키 제약조건의 삭제 옵션을 검토해야 합니다.
24. DELETE, TRUNCATE, DROP 비교
데이터를 삭제할 때 DELETE 외에도 TRUNCATE, DROP이라는 명령어가 있습니다. 이 셋은 비슷해 보이지만 의미가 다릅니다.
| 명령어 | 분류 | 삭제 대상 | 테이블 구조 | WHERE 사용 |
|---|---|---|---|---|
| DELETE | DML | 행 데이터 | 유지 | 가능 |
| TRUNCATE | DDL | 전체 데이터 | 유지 | 불가능 |
| DROP | DDL | 테이블 자체 | 삭제 | 불가능 |
DELETE는 조건을 지정해서 일부 행만 삭제할 수 있습니다. TRUNCATE는 테이블의 전체 데이터를 빠르게 삭제하지만 WHERE절을 사용할 수 없습니다. DROP은 테이블 자체를 삭제합니다.
25. TRUNCATE 예시
TRUNCATE는 테이블의 모든 데이터를 삭제하지만 테이블 구조는 유지합니다.
TRUNCATE TABLE 회원;
위 SQL은 회원 테이블의 모든 데이터를 삭제합니다. 하지만 회원 테이블 자체는 남아 있습니다.
TRUNCATE는 DELETE보다 빠를 수 있지만, 조건 삭제가 불가능하고 DDL에 해당하므로 트랜잭션 처리 방식에서 차이가 있을 수 있습니다.
26. DROP 예시
DROP은 테이블 자체를 삭제합니다.
DROP TABLE 회원;
위 SQL을 실행하면 회원 테이블의 데이터뿐만 아니라 테이블 구조 자체가 삭제됩니다. 따라서 매우 신중하게 사용해야 합니다.
27. 트랜잭션이란?
INSERT, UPDATE, DELETE는 데이터를 변경하는 명령어입니다. 이러한 데이터 변경 작업은 보통 트랜잭션(Transaction) 단위로 관리됩니다.
트랜잭션은 데이터베이스에서 하나의 논리적 작업 단위를 의미한다.
예를 들어 주문을 생성하는 과정은 여러 작업으로 이루어질 수 있습니다.
- 주문 테이블에 주문 정보 입력
- 주문상세 테이블에 상품 정보 입력
- 상품 재고 감소
- 결제 정보 입력
이 작업들은 하나의 흐름으로 성공하거나, 문제가 생기면 모두 취소되어야 합니다. 이런 작업 단위를 트랜잭션이라고 합니다.
28. COMMIT
COMMIT은 트랜잭션에서 수행한 변경 내용을 데이터베이스에 확정하는 명령어입니다.
INSERT INTO 회원 (회원번호, 이름, 이메일)
VALUES (1009, '한도윤', 'doyoon@example.com');
COMMIT;
COMMIT을 실행하면 INSERT한 내용이 확정됩니다. 확정된 이후에는 일반적으로 ROLLBACK으로 되돌릴 수 없습니다.
29. ROLLBACK
ROLLBACK은 트랜잭션에서 수행한 변경 내용을 취소하는 명령어입니다.
UPDATE 회원
SET 회원등급 = 'VIP'
WHERE 회원번호 = 1001;
ROLLBACK;
위 SQL은 회원등급을 VIP로 수정했다가 ROLLBACK을 통해 변경 전 상태로 되돌립니다.
ROLLBACK은 COMMIT 이전의 변경 내용을 취소할 때 사용합니다.
30. SAVEPOINT
SAVEPOINT는 트랜잭션 중간에 저장 지점을 만드는 명령어입니다.
INSERT INTO 회원 (회원번호, 이름, 이메일)
VALUES (1010, '오지우', 'jiwoo@example.com');
SAVEPOINT SP1;
UPDATE 회원
SET 회원등급 = 'VIP'
WHERE 회원번호 = 1010;
ROLLBACK TO SP1;
ROLLBACK TO SP1을 실행하면 SAVEPOINT SP1 이후의 작업만 취소할 수 있습니다.
SAVEPOINT는 긴 트랜잭션에서 일부 작업만 되돌리고 싶을 때 사용할 수 있습니다.
31. DML과 트랜잭션 정리
| 명령어 | 역할 |
|---|---|
| INSERT | 새로운 행 입력 |
| UPDATE | 기존 행 수정 |
| DELETE | 기존 행 삭제 |
| COMMIT | 변경 내용 확정 |
| ROLLBACK | 변경 내용 취소 |
| SAVEPOINT | 트랜잭션 중간 저장 지점 생성 |
32. DML 실행 전 확인 습관
INSERT, UPDATE, DELETE는 실제 데이터를 변경하기 때문에 실행 전 확인 습관이 중요합니다.
특히 UPDATE와 DELETE는 먼저 SELECT로 대상 데이터를 확인하는 것이 좋습니다.
수정 전 확인
SELECT *
FROM 회원
WHERE 회원등급 = '골드';
수정 실행
UPDATE 회원
SET 회원등급 = '우수'
WHERE 회원등급 = '골드';
삭제 전 확인
SELECT *
FROM 회원
WHERE 회원번호 = 1008;
삭제 실행
DELETE FROM 회원
WHERE 회원번호 = 1008;
실무에서는 실수로 전체 데이터를 수정하거나 삭제하는 사고를 막기 위해, WHERE절 확인이 매우 중요합니다.
33. DML에서 자주 하는 실수
| 실수 | 주의할 점 |
|---|---|
| INSERT 컬럼 수와 값 수가 다름 | 컬럼 개수와 VALUES 개수가 일치해야 함 |
| 문자값에 작은따옴표를 빼먹음 | 문자와 날짜 문자열은 작은따옴표 사용 |
| PRIMARY KEY 중복 입력 | 기본키 값은 중복될 수 없음 |
| NOT NULL 컬럼에 NULL 입력 | 필수 컬럼에는 반드시 값 입력 |
| UPDATE에서 WHERE절 누락 | 모든 행이 수정될 수 있음 |
| DELETE에서 WHERE절 누락 | 모든 행이 삭제될 수 있음 |
| COMMIT 전 확인 없이 확정 | 변경 내용 확인 후 COMMIT |
34. SQLD 관점에서 꼭 기억할 내용
이번 글에서 SQLD 공부를 위해 꼭 기억해야 할 내용은 다음과 같습니다.
- DML은 데이터를 조회, 입력, 수정, 삭제하는 명령어이다.
- INSERT는 테이블에 새로운 행을 입력한다.
- UPDATE는 기존 데이터를 수정한다.
- DELETE는 기존 데이터를 삭제한다.
- INSERT 시 컬럼 수와 값 수가 일치해야 한다.
- UPDATE와 DELETE는 WHERE절이 없으면 전체 행에 영향을 줄 수 있다.
- DELETE는 행 데이터만 삭제하고 테이블 구조는 유지한다.
- TRUNCATE는 전체 데이터를 삭제하지만 테이블 구조는 유지한다.
- DROP은 테이블 자체를 삭제한다.
- COMMIT은 변경 내용을 확정한다.
- ROLLBACK은 변경 내용을 취소한다.
- SAVEPOINT는 트랜잭션 중간 저장 지점을 만든다.
35. 핵심 요약
| 개념 | 핵심 내용 |
|---|---|
| INSERT | 테이블에 새로운 데이터를 입력한다. |
| UPDATE | 테이블의 기존 데이터를 수정한다. |
| DELETE | 테이블의 기존 데이터를 삭제한다. |
| WHERE | 수정 또는 삭제 대상을 제한한다. |
| COMMIT | 트랜잭션의 변경 내용을 확정한다. |
| ROLLBACK | 트랜잭션의 변경 내용을 취소한다. |
| DELETE | 데이터만 삭제하고 테이블 구조는 유지한다. |
| TRUNCATE | 전체 데이터를 빠르게 삭제하고 테이블 구조는 유지한다. |
| DROP | 테이블 자체를 삭제한다. |
36. 마무리
이번 글에서는 데이터를 추가, 수정, 삭제하는 INSERT, UPDATE, DELETE에 대해 정리했습니다.
INSERT는 새로운 행을 입력하고, UPDATE는 기존 행을 수정하며, DELETE는 기존 행을 삭제합니다. 이 세 명령어는 실제 데이터를 변경하기 때문에 SELECT문보다 더 신중하게 사용해야 합니다.
특히 UPDATE와 DELETE는 WHERE절을 빠뜨리면 전체 데이터가 영향을 받을 수 있습니다. 따라서 실행 전에 SELECT문으로 대상 데이터를 확인하고, 필요하다면 트랜잭션을 활용해 COMMIT과 ROLLBACK을 적절히 사용하는 것이 중요합니다.
다음 글에서는 테이블 구조를 만들고 변경하는 DDL, CREATE, ALTER, DROP에 대해 정리해 보겠습니다.

'Computer Science > Database' 카테고리의 다른 글
| [DB] 데이터베이스 개념노트 14편 - DCL, GRANT, REVOKE (0) | 2026.02.13 |
|---|---|
| [DB] 데이터베이스 개념노트 13편 - DDL, CREATE, ALTER, DROP (0) | 2026.02.13 |
| [DB] 데이터베이스 개념노트 11편 - JOIN (0) | 2026.02.07 |
| [DB] 데이터베이스 개념노트 10편 - GROUP BY, HAVING, 집계 함수 (0) | 2026.02.07 |
| [DB] 데이터베이스 개념노트 9편 - ORDER BY, 함수, CASE 표현식 (0) | 2026.02.07 |