SQL(Structured Query Language)은 데이터베이스를 관리하고 조작하기 위한 표준 언어다. 이 글에서는 SQL의 5가지 주요 범주인 DQL, DML, DDL, DCL, TCL의 정의와 개념, 그리고 이들 간의 차이점을 상세히 알아보고자 한다.

 

1. SQL의 5가지 주요 범주 개요

SQL은 기능과 목적에 따라 다음 5가지 주요 범주로 나눌 수 있다:

  1. DQL(Data Query Language): 데이터 조회를 위한 언어
  2. DML(Data Manipulation Language): 데이터 조작을 위한 언어
  3. DDL(Data Definition Language): 데이터 정의를 위한 언어
  4. DCL(Data Control Language): 데이터 제어를 위한 언어
  5. TCL(Transaction Control Language): 트랜잭션 제어를 위한 언어

각 범주는 서로 다른 목적과 특성을 가지고 있으며, 데이터베이스 작업의 다양한 측면을 처리한다. 이제 각 범주에 대해 자세히 살펴보자.

 

2. DQL(Data Query Language): 데이터 조회

2.1 DQL의 정의와 특징

DQL은 데이터베이스에서 데이터를 검색하고 조회하기 위한 SQL의 하위 집합이다. 기술적으로는 DML의 일부로 볼 수도 있지만, 데이터 조회의 중요성과 복잡성 때문에 별도의 범주로 분류하는 경우가 많다.

DQL의 핵심 명령어는 다음과 같다:

  • SELECT: 데이터베이스에서 데이터를 검색하는 기본 명령어

2.2 주요 DQL 구문과 활용

-- 기본 SELECT 구문
SELECT column1, column2, ...
FROM table_name
WHERE condition;

2.3 DQL 성능 최적화 고려사항

데이터를 조회하는 DQL은 성능에 큰 영향을 미칠 수 있다:

  1. 적절한 인덱스 사용: WHERE 절과 JOIN 조건에 사용되는 열에 인덱스를 생성하여 검색 속도를 향상시킨다.
  2. 필요한 열만 선택: SELECT * 대신 필요한 열만 명시적으로 선택하여 I/O를 줄인다.
  3. 효율적인 조인 전략: 테이블 크기와 조인 조건을 고려하여 가장 효율적인 조인 방식을 선택한다.
  4. EXPLAIN PLAN 활용: 쿼리의 실행 계획을 분석하여 성능 병목 지점을 식별한다.

 

3. DML(Data Manipulation Language): 데이터 조작

3.1 DML의 정의와 특징

DML은 데이터베이스 내의 데이터를 조작(삽입, 수정, 삭제)하기 위한 SQL의 하위 집합이다. 데이터의 내용은 변경하지만, 데이터베이스 구조는 변경하지 않는다는 특징이 있다.

DML의 핵심 명령어는 다음과 같다:

  • INSERT: 테이블에 새 데이터를 삽입
  • UPDATE: 기존 데이터를 수정
  • DELETE: 데이터를 삭제
  • MERGE: Oracle 등에서 제공하는 INSERT와 UPDATE를 결합한 명령어

3.2 주요 DML 구문과 활용

-- 기본 INSERT 구문
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);

-- 기본 UPDATE 구문
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

-- 기본 DELETE 구문
DELETE FROM table_name
WHERE condition;

-- MERGE 구문 (Oracle)
MERGE INTO target_table t
USING source_table s
ON (t.key_column = s.key_column)
WHEN MATCHED THEN
  UPDATE SET t.column1 = s.column1, t.column2 = s.column2
WHEN NOT MATCHED THEN
  INSERT (t.key_column, t.column1, t.column2)
  VALUES (s.key_column, s.column1, s.column2);

3.3 DML과 트랜잭션 관리

DML 명령어는 데이터베이스의 내용을 변경하므로 트랜잭션 관리와 밀접한 관련이 있다:

  1. 원자성 보장: 하나의 논리적 작업에 여러 DML 문이 필요한 경우, 트랜잭션을 사용하여 모두 성공하거나 모두 실패하도록 한다.
  2. 일관성 유지: 데이터 변경 작업은 제약 조건을 준수해야 한다.
  3. 격리성 관리: 동시에 실행되는 트랜잭션 간의 간섭을 방지한다.
  4. 지속성 확보: COMMIT 후에는 변경 사항이 영구적으로 저장된다.

 

4. DDL(Data Definition Language): 데이터 정의

4.1 DDL의 정의와 특징

DDL은 데이터베이스의 구조를 정의하거나 변경하기 위한 SQL의 하위 집합이다. 테이블, 인덱스, 뷰 등의 데이터베이스 객체를 생성, 변경, 삭제하는 데 사용된다.

DDL의 주요 특징은 명령어 실행 즉시 자동 커밋된다는 점이다. 따라서 ROLLBACK이 불가능하며, 신중하게 사용해야 한다.

DDL의 핵심 명령어는 다음과 같다:

  • CREATE: 새 데이터베이스 객체 생성
  • ALTER: 기존 객체의 구조 변경
  • DROP: 객체 삭제
  • TRUNCATE: 테이블의 모든 데이터 제거 (구조는 유지)
  • RENAME: 객체 이름 변경
  • COMMENT: 객체에 주석 추가

4.2 주요 DDL 구문과 활용

-- 테이블 생성
CREATE TABLE employees (
    employee_id NUMBER(6) PRIMARY KEY,
    first_name VARCHAR2(20),
    last_name VARCHAR2(25) NOT NULL,
    email VARCHAR2(25) UNIQUE,
    hire_date DATE DEFAULT SYSDATE,
    salary NUMBER(8,2) CHECK (salary > 0),
    department_id NUMBER(4),
    CONSTRAINT emp_dept_fk FOREIGN KEY (department_id) 
        REFERENCES departments (department_id)
);

-- 테이블 구조 변경
ALTER TABLE employees ADD (phone_number VARCHAR2(20));
ALTER TABLE employees MODIFY (email VARCHAR2(50));
ALTER TABLE employees DROP COLUMN phone_number;

-- 인덱스 생성
CREATE INDEX emp_name_idx ON employees(last_name, first_name);

-- 뷰 생성
CREATE VIEW emp_dept_view AS
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;

-- 테이블 삭제
DROP TABLE temp_employees;

-- 테이블 데이터 전체 삭제 (구조 유지)
TRUNCATE TABLE employees_backup;

-- 테이블 이름 변경
RENAME old_employees TO employees_archive;

-- 테이블에 주석 추가
COMMENT ON TABLE employees IS '직원 정보 테이블';
COMMENT ON COLUMN employees.salary IS '월급 (달러)';

4.3 DDL 사용 시 고려사항

  1. 자동 커밋: DDL 문은 실행 즉시 자동으로 커밋되므로, 실행 전에 신중하게 검토해야 한다.
  2. 운영 환경 주의: 운영 중인 시스템에서 DDL을 실행할 때는 서비스 영향을 최소화하도록 계획해야 한다.
  3. 객체 의존성: 객체 간의 의존 관계를 고려하여 순서대로 작업해야 한다.
  4. 백업: 중요한 DDL 작업 전에는 항상 백업을 수행하는 것이 좋다.

 

5. DCL(Data Control Language): 데이터 제어

5.1 DCL의 정의와 특징

DCL은 데이터베이스에 대한 접근 권한과 사용자 권한을 제어하기 위한 SQL의 하위 집합이다. 데이터 보안, 무결성, 동시성 제어 등에 관련된 명령어를 포함한다.

DCL의 핵심 명령어는 다음과 같다:

  • GRANT: 사용자에게 권한을 부여
  • REVOKE: 사용자에게서 권한을 회수

5.2 주요 DCL 구문과 활용

-- 시스템 권한 부여
GRANT CREATE SESSION TO app_user;
GRANT CREATE TABLE, CREATE VIEW TO app_user;

-- 객체 권한 부여
GRANT SELECT, INSERT, UPDATE ON employees TO app_user;
GRANT SELECT ON hr.departments TO app_user;

-- 롤(Role)을 통한 권한 관리
CREATE ROLE app_developer;
GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE TO app_developer;
GRANT app_developer TO new_dev_user;

-- WITH ADMIN OPTION: 권한을 다른 사용자에게 부여할 수 있는 권한 포함
GRANT CREATE TABLE TO app_user WITH ADMIN OPTION;

-- 시스템 권한 회수
REVOKE CREATE VIEW FROM app_user;

-- 객체 권한 회수
REVOKE UPDATE ON employees FROM app_user;

-- 롤 회수
REVOKE app_developer FROM dev_user;

5.3 효과적인 권한 관리 전략

  1. 최소 권한 원칙: 사용자에게 필요한 최소한의 권한만 부여한다.
  2. 롤 기반 권한 관리: 직접적인 권한 부여보다 롤을 통한 권한 관리가 효율적이다.
  3. 정기적인 권한 감사: 불필요한 권한은 회수하고, 적절성을 주기적으로 검토한다.
  4. 프록시 인증 활용: 필요한 경우 특정 사용자로 작업을 수행할 수 있는 프록시 인증을 고려한다.

 

6. TCL(Transaction Control Language): 트랜잭션 제어

6.1 TCL의 정의와 특징

TCL은 데이터베이스 트랜잭션을 제어하기 위한 SQL의 하위 집합이다. 여러 DML 문을 하나의 논리적 작업 단위로 관리하고, 데이터 일관성을 유지하는 데 사용된다.

TCL의 핵심 명령어는 다음과 같다:

  • COMMIT: 트랜잭션의 변경사항을 영구적으로 저장
  • ROLLBACK: 트랜잭션의 변경사항을 취소하고 이전 상태로 복원
  • SAVEPOINT: 트랜잭션 내에 저장점을 설정하여 부분 롤백을 가능하게 함
  • SET TRANSACTION: 트랜잭션의 특성(읽기 전용, 격리 수준 등)을 설정

6.2 주요 TCL 구문과 활용

-- 기본 트랜잭션 관리
UPDATE accounts SET balance = balance + 1000 WHERE account_id = 202;
COMMIT;  -- 변경사항 영구 저장

-- 오류 발생 시 롤백
UPDATE accounts SET balance = balance - 1000 WHERE account_id = 101;
-- 오류 발생 또는 조건 미충족
ROLLBACK;  -- 모든 변경사항 취소

-- SAVEPOINT를 사용한 부분 롤백
INSERT INTO orders VALUES (1001, 'C001', SYSDATE);
SAVEPOINT order_created;

-- 트랜잭션 특성 설정
SET TRANSACTION READ ONLY;  -- 읽기 전용 트랜잭션
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;  -- 격리 수준 설정

 

7. SQL – DQL, DML, DDL, DCL, TCL 주요 차이점 비교

7.1 실행 시점과 커밋 동작

SQL 범주 자동 커밋 롤백 가능 세션 종료 시 동작
DQL 해당 없음 해당 없음 영향 없음
DML 아니오 자동 롤백
DDL 아니오 변경사항 유지
DCL 아니오 변경사항 유지
TCL 해당 없음 해당 없음 해당 없음

7.2 영향을 미치는 대상

SQL 범주 데이터 변경 구조 변경 권한 변경 트랜잭션 제어
DQL 아니오 아니오 아니오 아니오
DML 아니오 아니오 아니오
DDL 간접적으로 아니오 간접적으로
DCL 아니오 아니오 아니오
TCL 간접적으로 아니오 아니오

7.3 사용 시나리오

SQL 범주 주요 사용 시나리오
DQL 데이터 조회, 보고서 생성, 데이터 분석
DML 데이터 입력, 수정, 삭제, 배치 처리
DDL 데이터베이스 설계, 스키마 변경, 객체 관리
DCL 보안 정책 구현, 권한 관리, 사용자 접근 제어
TCL 데이터 일관성 유지, 복구 전략, 동시성 제어

7.4 사용자 역할별 주요 사용 범주

사용자 역할 주로 사용하는 SQL 범주
데이터베이스 관리자 DDL, DCL
애플리케이션 개발자 DQL, DML, TCL
데이터 분석가 DQL
보안 관리자 DCL
ETL 개발자 DML, TCL

 

 

SQL의 5가지 주요 범주(DQL, DML, DDL, DCL, TCL)는 각각 고유한 목적과 특성을 가지고 있으며, 데이터베이스 시스템의 다양한 측면을 관리하는 데 필수적이다. 효과적인 데이터베이스 작업을 위해서는 이러한 범주를 이해하고, 상황에 맞게 적절히 활용하는 것이 중요하다.

 

 

댓글 남기기