INSERT·UPDATE·DELETE·MERGE로 데이터를 변경하는 방법.
데이터 추가·수정·삭제
지금까지는 데이터를 읽기만 했다면, 이제 직접 데이터를 바꿀 차례입니다. 데이터를 변경하는 명령을 DML(Data Manipulation Language) 이라고 부릅니다. 변경 작업은 한 번 잘못하면 되돌리기 어려우니 조건을 꼼꼼히 확인하는 습관이 중요합니다.
학습 목표
INSERT로 단건·다건·조회 결과를 삽입합니다.UPDATE와DELETE로 조건에 맞는 행을 변경합니다.TRUNCATE와DELETE의 차이를 이해합니다.MERGE와OUTPUT절을 활용합니다.
INSERT — 데이터 추가
-- 단건 삽입
INSERT INTO Employees (name, department, salary)
VALUES ('홍길동', 'Sales', 3000000);
-- 다건 삽입
INSERT INTO Employees (name, department, salary)
VALUES
('김철수', 'Dev', 4000000),
('이영희', 'Dev', 4200000);
-- 조회 결과를 삽입 (INSERT ... SELECT)
INSERT INTO EmployeesArchive (name, department, salary)
SELECT name, department, salary
FROM Employees
WHERE status = 'retired';
💡 TIP — 열 목록을 명시하는 습관을 들이세요.
INSERT INTO Employees VALUES (...)처럼 생략하면 테이블 구조가 바뀔 때 엉뚱한 열에 값이 들어갈 수 있습니다.
UPDATE — 데이터 수정
-- 특정 직원의 급여 인상
UPDATE Employees
SET salary = salary * 1.1
WHERE department = 'Dev';
-- 여러 열 동시 수정
UPDATE Employees
SET department = 'R&D', salary = 5000000
WHERE id = 7;
⚠️ 주의 —
WHERE를 빠뜨린UPDATE는 모든 행을 변경합니다. 실행 전에 같은 조건으로SELECT를 먼저 돌려 대상 행을 확인하세요.
DELETE — 데이터 삭제
DELETE FROM Employees
WHERE status = 'retired';
다른 테이블을 참조해 삭제할 수도 있습니다.
DELETE e
FROM Employees e
JOIN Departments d ON e.dept_id = d.id
WHERE d.name = '폐지된부서';
TRUNCATE vs DELETE
| 구분 | DELETE | TRUNCATE |
|---|---|---|
조건(WHERE) | 가능 | 불가(전체 삭제) |
| 로그 | 행 단위 기록 | 최소 기록(빠름) |
| IDENTITY 시드 | 유지 | 초기화 |
| 트리거 | 작동 | 작동 안 함 |
-- 테이블 전체를 빠르게 비우기
TRUNCATE TABLE TempLog;
전체를 비울 거라면 TRUNCATE 가 훨씬 빠릅니다. 단, 외래키로 참조되는 테이블에는 사용할 수 없습니다.
MERGE — 있으면 수정, 없으면 삽입 (Upsert)
MERGE INTO Inventory AS tgt
USING StagingStock AS src
ON tgt.product_id = src.product_id
WHEN MATCHED THEN
UPDATE SET tgt.qty = src.qty
WHEN NOT MATCHED BY TARGET THEN
INSERT (product_id, qty) VALUES (src.product_id, src.qty)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
대상에 있으면 수정, 없으면 삽입, 원본에 없으면 삭제까지 한 문장으로 처리합니다.
OUTPUT 절 — 변경된 행 확인
변경한 행이 무엇인지 즉시 반환받을 수 있습니다.
UPDATE Employees
SET salary = salary + 100000
OUTPUT deleted.salary AS 이전급여, inserted.salary AS 변경급여
WHERE department = 'Sales';
inserted— 변경 후 값(INSERT/UPDATE)deleted— 변경 전 값(DELETE/UPDATE)
이력 테이블에 변경 내역을 남길 때 유용합니다.
요약
INSERT는 단건·다건·INSERT ... SELECT로 데이터를 추가합니다.UPDATE/DELETE는 반드시WHERE로 대상을 한정하세요.- 전체 삭제는
TRUNCATE가 빠르지만 조건·트리거·FK 제약이 있습니다. MERGE는 upsert를,OUTPUT은 변경된 행 확인을 한 문장으로 처리합니다.
연습문제
- 새 직원 3명을 한 번의
INSERT로 추가하세요. - 'Sales' 부서의 급여를 5% 인상하는
UPDATE를 작성하세요. - 퇴사자(
status = 'retired')를 보관 테이블에 복사한 뒤 원본에서 삭제하세요. UPDATE에OUTPUT절을 붙여 변경 전후 급여를 함께 반환하세요.
힌트 — 3번은
INSERT ... SELECT후DELETE, 4번은OUTPUT deleted.salary, inserted.salary를 사용합니다.
💡 연습문제 풀이
불러오는 중…
댓글 0
“MSSQL” 강좌에 대한 댓글입니다.