dev.syw

INSERT·UPDATE·DELETE·MERGE로 데이터를 변경하는 방법.

데이터 추가·수정·삭제

지금까지는 데이터를 읽기만 했다면, 이제 직접 데이터를 바꿀 차례입니다. 데이터를 변경하는 명령을 DML(Data Manipulation Language) 이라고 부릅니다. 변경 작업은 한 번 잘못하면 되돌리기 어려우니 조건을 꼼꼼히 확인하는 습관이 중요합니다.

학습 목표

  • INSERT 로 단건·다건·조회 결과를 삽입합니다.
  • UPDATEDELETE 로 조건에 맞는 행을 변경합니다.
  • TRUNCATEDELETE 의 차이를 이해합니다.
  • MERGEOUTPUT 절을 활용합니다.

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

구분DELETETRUNCATE
조건(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 은 변경된 행 확인을 한 문장으로 처리합니다.

연습문제

  1. 새 직원 3명을 한 번의 INSERT 로 추가하세요.
  2. 'Sales' 부서의 급여를 5% 인상하는 UPDATE 를 작성하세요.
  3. 퇴사자(status = 'retired')를 보관 테이블에 복사한 뒤 원본에서 삭제하세요.
  4. UPDATEOUTPUT 절을 붙여 변경 전후 급여를 함께 반환하세요.

힌트 — 3번은 INSERT ... SELECTDELETE, 4번은 OUTPUT deleted.salary, inserted.salary 를 사용합니다.

💡 연습문제 풀이

불러오는 중…

함께 보면 좋은 자료

댓글 0

MSSQL” 강좌에 대한 댓글입니다.

댓글을 작성하려면 로그인이 필요합니다.