DML(INSERT·UPDATE·DELETE·MERGE)
쉽게 말하면
DML은 표 안의 데이터를 바꾸는 명령이에요. 새 줄을 넣고(INSERT), 값을 고치고(UPDATE), 줄을 지우고(DELETE), 있으면 고치고 없으면 넣어요(MERGE). 바꾼 내용은 COMMIT을 해야 확정되고, 그 전에는 ROLLBACK으로 되돌릴 수 있어요.
시험용 정의
DML(Data Manipulation Language)은 테이블의 데이터를 바꾸는 명령이다. INSERT(행 넣기), UPDATE(값 고치기), DELETE(행 지우기), MERGE(있으면 UPDATE, 없으면 INSERT). DML로 바꾼 내용은 COMMIT해야 확정되고, 그 전에는 ROLLBACK으로 되돌릴 수 있다(Oracle 기본).
비유로 이해하기
장부에 연필로 적는 것이다. INSERT는 새 줄 쓰기, UPDATE는 지우고 고쳐 쓰기, DELETE는 줄 지우기. 연필 자국은 COMMIT(볼펜으로 덧쓰기) 전까지 지우개(ROLLBACK)로 지울 수 있다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| COMMIT | 지금까지의 변경을 확정해 다른 사용자도 볼 수 있게 한다 |
| ROLLBACK | 확정하지 않은 변경을 모두 되돌린다 |
| 제약조건 | PK 중복, NOT NULL 같은 규칙. 어기는 DML은 오류로 거부된다 |
| 소스 / 타깃 | MERGE에서 읽어 오는 쪽(USING) / 바뀌는 쪽(INTO) |
네 가지 DML
| 명령 | 모양 | 메모 |
|---|---|---|
| INSERT | INSERT INTO dept (deptno, dname) VALUES (50, 'QA') | 열 목록을 생략하면 모든 열 값을 테이블 순서대로 다 줘야 한다(모자라면 '값의 수가 충분하지 않습니다' 오류). 열 목록을 쓰면 빠진 열은 NULL(또는 DEFAULT) |
| INSERT … SELECT | INSERT INTO emp_bak SELECT * FROM emp WHERE deptno = 20 | 조회 결과를 한꺼번에 넣는다 |
| UPDATE | UPDATE emp SET sal = sal * 1.1, comm = 0 WHERE deptno = 30 | WHERE 없으면 모든 행 |
| DELETE | DELETE FROM emp WHERE ename = 'OH' | FROM은 생략 가능. WHERE 없으면 모든 행 삭제(구조는 남음) |
| MERGE | MERGE INTO 타깃 USING 소스 ON (조건) WHEN MATCHED THEN UPDATE … WHEN NOT MATCHED THEN INSERT … | 조건에 맞으면 UPDATE, 없으면 INSERT. 한쪽만 써도 된다 |
DELETE vs TRUNCATE vs DROP
| 구분 | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| 종류 | DML | DDL | DDL |
| 지우는 것 | 조건에 맞는 행 (WHERE 가능) | 모든 행 (구조는 남음) | 테이블 자체(구조까지) |
| ROLLBACK | 가능 (COMMIT 전) | 불가 (자동 커밋) | 불가 (자동 커밋) |
| 저장 공간 | 그대로 | 처음 상태로 돌려줌 | 모두 돌려줌 |
| 속도 | 행마다 기록을 남겨 느림 | 빠름 | 빠름 |
시험에 이렇게 나와요
- INSERT 열 목록 생략 규칙, 값 개수 불일치 오류
- UPDATE·DELETE에 WHERE가 없으면 전체 행
- MERGE 문법과 결과 (MATCHED → UPDATE, NOT MATCHED → INSERT)
- DELETE(DML, ROLLBACK 가능) vs TRUNCATE·DROP(DDL, 자동 커밋)
- DML 실행 후 결과 테이블 고르기
출제 범위·공식 안내 기반
확인 문제
Q1. UPDATE emp SET sal = sal * 1.1을 WHERE 없이 실행하면?
- 오류가 난다
- 아무것도 바뀌지 않는다
- 모든 행의 급여가 10% 오른다
- 첫 번째 행만 바뀐다
정답 보기
3번 모든 행의 급여가 10% 오른다
UPDATE와 DELETE는 WHERE가 없으면 테이블의 모든 행에 적용된다. 실수하면 COMMIT 전에 ROLLBACK으로 되돌려야 한다.
Q2. DEPT(DEPTNO, DNAME, LOC)에 INSERT INTO dept VALUES (50, 'QA')를 실행하면?
- DNAME에 NULL이 들어간다
- 오류: 값의 수가 충분하지 않다
- LOC에 빈 문자열이 들어간다
- LOC에 NULL이 들어간다
정답 보기
2번 오류: 값의 수가 충분하지 않다
열 목록을 생략하면 모든 열 값을 줘야 한다. 일부만 넣으려면 열 목록을 쓴다.
Q3. 테이블 구조는 남기고 모든 행을 지우되, ROLLBACK으로 되돌릴 수 있는 명령은?
- TRUNCATE TABLE
- DELETE FROM 테이블
- ALTER TABLE
- DROP TABLE
정답 보기
2번 DELETE FROM 테이블
DELETE는 DML이라 COMMIT 전이면 ROLLBACK된다. TRUNCATE·DROP은 DDL이라 자동 커밋.
Q4. MERGE 문에 대한 설명으로 틀린 것은?
- WHEN MATCHED 절과 WHEN NOT MATCHED 절은 반드시 둘 다 써야 한다
- USING 뒤에는 테이블이나 서브쿼리가 온다
- WHEN NOT MATCHED에서는 INSERT를 한다
- ON 조건에 맞는 행은 WHEN MATCHED 절이 처리한다
정답 보기
1번 WHEN MATCHED 절과 WHEN NOT MATCHED 절은 반드시 둘 다 써야 한다
'WHEN MATCHED와 WHEN NOT MATCHED를 반드시 둘 다 써야 한다'가 틀리다. 한쪽만 써도 된다. 맞으면 UPDATE(또는 DELETE), 안 맞으면 INSERT를 한다.
Q5. UPDATE emp SET sal = sal * 1.1 을 실행하면?
- 첫 행만 바뀐다
- WHERE가 없어 오류가 난다
- 모든 사원의 급여가 10% 오른다
- 아무 행도 바뀌지 않는다
정답 보기
3번 모든 사원의 급여가 10% 오른다
WHERE가 없으면 모든 행이 바뀐다.
Q6. MERGE INTO t USING s ON (t.id = s.id) WHEN MATCHED THEN UPDATE … WHEN NOT MATCHED THEN INSERT … 에서 s에만 있는 행은?
- 무시된다
- t에서 지워진다
- INSERT된다
- UPDATE된다
정답 보기
3번 INSERT된다
짝이 없는(NOT MATCHED) 행은 INSERT, 짝이 있는 행은 UPDATE.
헷갈리기 쉬운 O·X
DELETE 문에서 FROM은 생략할 수 있다.
정답 보기
O DELETE emp WHERE …도 된다(Oracle).
TRUNCATE는 WHERE 절로 일부 행만 지울 수 있다.
정답 보기
X TRUNCATE는 항상 모든 행이다. 일부는 DELETE.
UPDATE 문 하나로 여러 열을 함께 바꿀 수 있다.
정답 보기
O SET sal = …, comm = … 처럼 쉼표로.