From ripples to waves

SQL | (1) DDL, DML, TCL, DCL 본문

Computer Science/데이터베이스 (Database), SQL

SQL | (1) DDL, DML, TCL, DCL

juyeong_ 2024. 4. 29. 21:51

SQL 로 할 수 있는 업무는 그 목적 및 역할에 따라 크게 DDL(Data Definition Language), DML(Data Manipulation Language), TCL (Transaction Control Language), DCL(Data Control Language) 로 분류할 수 있다.

1. DDL (Data Definition Language)

- 테이블, 인덱스, VIEW 등 객체의 C(생성)U(변경)D(삭제) -> 스키마 구조 정의/재정의

 

주요 명령어
- CREATE (테이블, 인덱스, VIEW, SEQUENCE)
- ALTER (컬럼 추가/타입 변경, 제약조건 추가/수정 등)
- DROP (특정 객체(테이블) 삭제)
- TRUNCATE (테이블의 모든 row(record)를 비우기)
- 제약조건 (어떤 컬럼이 PK이다, UNIQUE 다, NOT NULL 이다 ... 등)

 

(예시 1)

DROP TABLE 직원

 

-> 직원 테이블(객체) 자체가 DB에서 제거됨. 즉, 테이블 구조, 데이터, 제약조건, 인덱스 모두 제거

 

(예시 2)

TRUNCATE TABLE 직원

-> 직원 테이블 및 제약조건 등은 그대로 남겨두고, 데이터만 쭉 밀어버림.


2. DML (Data Manipulation Language)

- 테이블의 row(record)를 CRUD 한다.

- DML 을 통해 가해진 변경은 COMMIT 을 해야만 확정된다. (DBMS 에서 Autocommit 하는 경우 제외)

 

주요 명령어
- INSERT (행 Create)
- UPDATE (행 Update): WHERE 잘 해주지 않으면 전체 선택될수도..
- DELETE (행 Delete): WHERE 잘 해주지 않으면 전체 선택될수도..
- SELECT (행 Read)

(예시 1)

INSERT INTO 직원(사번, 이름, 부서ID, 급여)
VALUES (101, '김주영', 10, 4000);

 

-> 직원 테이블에 (101, '김주영', 10, 4000) 라는 row 를 추가한다.

(예시 2)

UPDATE 직원
SET 급여 = 급여 * 1.05
WHERE 부서ID = 10;

 

-> 직원 테이블의 부서ID 가 10인 직원들 '모두'에 대해서 급여를 1.05 배 곱하여 업데이트한다.

(예시 3)

DELETE FROM 직원
WHERE 사번 = 101;

 

-> 직원 테이블에서 사번이 101인 'row'를 삭제한다. 

(예시 4)

SELECT 이름, 급여
FROM 직원
WHERE 급여 >= 4000
ORDER BY 급여 DESC;

 

-> 직원 테이블에서, 급여가 4000 이상인 row를 찾고, 그들의 '이름', '급여'를 출력한다. 이때, '급여'를 기준으로 내림차순 정렬한다.

 


3. TCL (Transaction Control Language)

- DML 을 통해 Row 를 CRUD 한 것을 Commit 하거나 Rollback 한다.
- DDL 로 객체 조작을 통해 스키마 구조를 바꾼 경우, 대부분 즉시 커밋된다. 따라서 TCL 로 되돌리기 어렵다.
- 트랜잭션(Transaction): DML을 통해 일련의 CRUD 작업들을 했을 때, 적절한 작업들을 트랜잭션으로 묶는다. 즉, 작업 단위임.

- 트랜잭션에 대해서는 원자성(Atomicity)이 보장되어야 함. 원자성은 '트랜잭션 내 작업들은 모두 실행(All)되거나, 전혀 실행되지 않아야 한다(Nothing)'는 원칙임. 즉, COMMIT 또는 ROLLBACK 뿐이라는 거임.


- COMMIT (변경사항 영구 반영)
- ROLLBACK (직전 커밋 시점으로 되돌림)
- SAVEPOINT (세이브포인트 지정)
- ROLLBACK TO SAVEPOINT (세이브포인트로 돌아가기)

(예시)

 

UPDATE 계좌 SET 잔액 = 잔액 - 100 WHERE 계좌번호 = 'A';
UPDATE 계좌 SET 잔액 = 잔액 + 100 WHERE 계좌번호 = 'B';

COMMIT;

-- 또는 문제 생기면 ROLLBACK
ROLLBACK;



트랜잭션은 보통 “BEGIN(첫 DML 작업) ~ COMMIT/ROLLBACK” 사이의 모든 작업을 하나의 단위로 본다.

따라서, 커밋으로 위 DML 두 줄이 하나의 트랜잭션으로 묶이게 되었다.


4. DCL (Data Control Language)

- 사용자에게 권한을 부여/회수. 보안 정책 관리
- GRANT (권한 부여)
- REVOKE (권한 회수)
- REVOKE는 연쇄적으로 영향을 줄 수 있음 (ex. 철수가 다른 사람에게 권한을 다시 부여했을 때)

(예시 1)

GRANT SELECT ON 직원 TO 철수;

 

-> 철수에게 '직원' 테이블 SELECT 권한 부여

 

(예시 2)

REVOKE SELECT ON 직원 FROM 철수;

 

-> 철수로부터 '직원' 테이블에 대한 SELECT 권한 회수