SQL 언어 분류 — DDL, DML, DCL, TCL

SQL 명령을 DDL·DML·DCL·TCL로 분류하는 기준과 각 범주의 역할, 자동 커밋 여부 등 실무에서 자주 혼동하는 개념을 정리합니다.

· 6 min read · PALDYN Team

지난 글에서 SQL이 클라이언트에서 DBMS까지 전달되는 경로를 살펴봤습니다. 이번에는 SQL 명령어 자체를 분류합니다. DDL, DML, DCL, TCL이라는 네 글자 약어를 들어봤지만 정확히 어떤 기준으로 나뉘는지, 실무에서 왜 이 구분이 중요한지 살펴봅니다.

왜 분류가 필요한가

SQL 명령은 종류에 따라 동작 방식이 다릅니다.

  • DDL은 대부분의 DBMS에서 **자동으로 커밋(COMMIT)**됩니다. 실수로 DROP TABLE을 실행하면 ROLLBACK으로 복구할 수 없습니다.
  • DML은 트랜잭션 안에서 실행되고 ROLLBACK으로 되돌릴 수 있습니다.
  • DCL은 권한을 즉시 적용합니다.
  • TCL은 트랜잭션 생명주기를 관리합니다.

이 차이를 모르면 의도치 않은 데이터 손실이나 권한 문제가 생깁니다.

네 가지 범주

SQL 언어 범주 전체 지도

DDL — Data Definition Language

“구조”를 정의하고 변경합니다.

명령설명
CREATE테이블, 인덱스, 뷰, 시퀀스 등 생성
ALTER기존 객체 구조 변경 (열 추가, 타입 변경)
DROP객체 삭제 (데이터 포함)
TRUNCATE모든 행 삭제 (DDL이므로 대부분 롤백 불가, 빠름)
RENAME객체 이름 변경

Oracle에서는 DDL이 실행되기 전후에 자동으로 COMMIT이 발생합니다. PostgreSQL은 트랜잭션 안에서 DDL을 실행하고 ROLLBACK할 수 있습니다(예외: DROP DATABASE).

DML — Data Manipulation Language

“데이터”를 조회하고 변경합니다.

명령설명
SELECT데이터 조회
INSERT새 행 삽입
UPDATE기존 행 수정
DELETE행 삭제
MERGEINSERT/UPDATE/DELETE 복합 처리

DML은 트랜잭션 범위 안에서 실행됩니다. 명시적 트랜잭션이 없어도 autocommit 모드에서는 각 문이 자동으로 커밋됩니다.

DCL — Data Control Language

“권한”을 부여하거나 회수합니다.

명령설명
GRANT사용자/역할에 권한 부여
REVOKE부여된 권한 회수
-- 읽기 권한만 부여
GRANT SELECT ON orders TO reporting_user;

-- INSERT 권한 회수
REVOKE INSERT ON orders FROM reporting_user;

TCL — Transaction Control Language

“트랜잭션”을 시작·종료·복원합니다.

명령설명
BEGIN / START TRANSACTION트랜잭션 시작
COMMIT변경 사항 영구 저장
ROLLBACK변경 사항 취소
SAVEPOINT중간 복원 지점 설정
RELEASE SAVEPOINT세이브포인트 해제

코드로 보는 네 범주

각 범주 코드 예시

-- DDL: 구조 생성
CREATE TABLE orders (
    id          INT           PRIMARY KEY,
    customer_id INT           NOT NULL,
    total       NUMERIC(12,2) NOT NULL
);

-- TCL + DML: 안전한 데이터 조작
BEGIN;
    INSERT INTO orders (id, customer_id, total) VALUES (1, 42, 99000);
    UPDATE orders SET total = 98000 WHERE id = 1;
COMMIT;  -- 또는 문제 발생 시 ROLLBACK;

-- DCL: 권한 제어
GRANT SELECT ON orders TO analyst;

DQL이라는 추가 범주

일부 교재는 SELECT를 DML에서 분리해 **DQL(Data Query Language)**로 구분합니다. 읽기 전용이라는 특성이 다르기 때문입니다. 표준 문서는 이 구분을 두지 않지만, 실무에서 SELECT 권한만 따로 부여하거나 읽기 전용 레플리카를 별도로 두는 설계에서 이 개념이 유용합니다.

DDL이 자동 커밋되는 이유

DDL은 **카탈로그(시스템 테이블)**를 수정합니다. 카탈로그는 다른 세션이 동시에 참조하는 공유 상태입니다. 긴 트랜잭션 안에서 카탈로그를 수정하면 잠금 경합이 심해지므로, 대부분의 DBMS가 DDL을 즉시 커밋하도록 설계합니다. PostgreSQL이 예외적으로 DDL을 트랜잭션에 포함하는 것은 유연성을 제공하기 위한 독자적 선택입니다.

정리

범주핵심 동사대상트랜잭션
DDLCREATE, ALTER, DROP객체 구조대부분 자동 COMMIT
DMLSELECT, INSERT, UPDATE, DELETE데이터트랜잭션 내 실행
DCLGRANT, REVOKE권한즉시 적용
TCLCOMMIT, ROLLBACK트랜잭션트랜잭션 제어 자체

다음 글부터는 DDL의 핵심인 CREATE TABLE을 자세히 살펴봅니다.


지난 글: 클라이언트-서버 프로토콜 — SQL이 전달되는 방식

다음 글: CREATE TABLE 기초 — 테이블을 만드는 방법


읽어주셔서 감사합니다. 😊