2025-08-17 16:43

Tags:

개발자 필수 스킬, SQL 핸드북 (DML, DDL, DCL, TCL 총정리)

데이터가 비즈니스의 핵심 자산이 된 오늘날, 우리는 매일 방대한 양의 데이터와 함께 살아갑니다. 스마트폰 앱부터 거대한 기업의 서버까지, 데이터는 보이지 않는 곳에서 세상을 움직이고 있죠. 이 데이터를 저장하고, 관리하고, 또 의미 있는 정보로 꺼내 쓰는 데 사용되는 가장 보편적이고 강력한 언어가 바로 SQL입니다.

SQL을 단순히 ‘데이터베이스용 프로그래밍 언어’라고만 알고 계셨다면, 이 핸드북을 통해 그 생각은 완전히 바뀔 것입니다. SQL은 데이터를 위한 ‘대화법’에 가깝습니다. 잘 정리된 도서관의 사서에게 원하는 책을 정확히 요청하는 것처럼, 우리는 SQL을 통해 데이터베이스에게 원하는 데이터를 명확하게 요청하고 관리할 수 있습니다.

이 핸드북에서는 SQL의 탄생 배경부터 시작하여, 그 핵심을 이루는 네 가지 주요 언어 그룹인 DML, DDL, DCL, TCL에 대해 체계적으로 알아볼 것입니다. 마치 잘 짜인 소설처럼, SQL의 세계를 한 단계씩 탐험해 봅시다.

1장: SQL의 탄생 - 왜 우리는 SQL을 사용하게 되었을까?

모든 위대한 발명품 뒤에는 해결해야 할 ‘문제’가 있었습니다. SQL도 마찬가지입니다. SQL이 등장하기 전, 1960년대의 데이터베이스는 지금과는 사뭇 다른 모습이었습니다. 계층형(Hierarchical) 또는 네트워크형(Network) 데이터베이스 모델이 주를 이루었죠.

이 모델들은 데이터를 나무뿌리나 거미줄처럼 복잡하게 연결된 구조로 저장했습니다. 마치 한 번 들어가면 길을 잃기 쉬운 미로와 같았죠. 데이터를 가져오려면 데이터의 물리적인 구조를 속속들이 알아야 했고, ‘어떻게’ 데이터를 찾을지 그 경로를 일일이 코드로 지정해 줘야 했습니다. 이는 매우 복잡하고 비효율적이었으며, 전문가가 아니면 데이터를 다루는 것 자체가 불가능에 가까웠습니다.

이러한 혼돈 속에서 1970년, IBM의 연구원이었던 에드거 F. 커드(Edgar F. Codd) 박사가 “A Relational Model of Data for Large Shared Data Banks”라는 혁신적인 논문을 발표합니다. 그는 복잡한 연결 구조 대신, 모든 데이터를 간단한 표(Table) 형식으로 표현하는 **관계형 모델(Relational Model)**을 제안했습니다. 행(Row)과 열(Column)으로 이루어진 이 단순한 구조는 데이터의 논리적 관계를 명확하게 보여주었고, 데이터베이스 세계의 혁명을 예고했습니다.

이 관계형 모델이라는 새로운 패러다임을 실제로 구현하기 위한 언어가 필요했습니다. IBM은 ‘System R’이라는 프로젝트를 통해 관계형 데이터베이스 관리 시스템(RDBMS)을 개발하기 시작했고, 이 시스템과 소통하기 위한 언어로 **SEQUEL(Structured English Query Language)**을 만듭니다. 이것이 바로 오늘날 우리가 아는 SQL의 전신입니다.

SQL의 핵심 철학은 ‘어떻게(How)‘가 아닌 **‘무엇을(What)‘**에 집중하는 것이었습니다. 개발자는 더 이상 데이터에 접근하는 복잡한 경로를 고민할 필요 없이, 그저 “어떤 조건의 데이터를 원한다”라고 선언하기만 하면 되었습니다. 마치 고급 레스토랑에서 셰프에게 복잡한 조리 과정을 설명할 필요 없이 ‘스테이크 미디엄 레어’라고 주문만 하면 되는 것처럼 말이죠. 이 선언적(Declarative) 특성 덕분에 SQL은 배우기 쉽고 사용하기 편리하여 빠르게 표준으로 자리 잡았고, 40년이 훌쩍 지난 지금까지도 데이터베이스 언어의 왕좌를 지키고 있습니다.

2장: 데이터 조작 언어 (DML) - 데이터와 대화하기

DML(Data Manipulation Language)은 이름 그대로 저장된 데이터를 ‘조작’하기 위한 명령어들의 집합입니다. 데이터베이스와 가장 빈번하게 소통하는 부분이며, 우리가 흔히 CRUD(Create, Read, Update, Delete) 라고 부르는 작업을 수행합니다. DML은 데이터라는 재료를 가지고 요리를 하는 과정과 같습니다.

1. SELECT: 데이터에게 질문을 던지는 기술

SELECT는 DML의 심장이자 SQL의 꽃입니다. 데이터베이스에서 원하는 데이터를 조회(Read) 하는 데 사용되며, 가장 정교하고 다양한 옵션을 가지고 있습니다.

  • 기본 구조: SELECT [조회할 열] FROM [테이블 이름] WHERE [조건];

  • 비유: 거대한 엑셀 시트에서 특정 조건을 만족하는 행과 열만 필터링해서 새로운 시트로 뽑아내는 것과 같습니다.

예시: employees 테이블에서 ‘Sales’ 부서에 속하고, 연봉이 50,000 이상인 직원의 이름과 이메일을 조회하고 싶다면?

SELECT name, email
FROM employees
WHERE department = 'Sales' AND salary >= 50000;
```SELECT`는 `GROUP BY`, `HAVING`, `ORDER BY` 등의 절과 함께 사용되어 데이터를 집계하고, 그룹화하고, 정렬하는 등 무궁무진한 분석을 가능하게 합니다.

### **2. INSERT: 새로운 데이터를 환영하다**

`INSERT`는 테이블에 새로운 데이터 행을 **생성(Create)** 하는 명령어입니다.

- **기본 구조:** `INSERT INTO [테이블 이름] ([열1], [열2], ...) VALUES ([값1], [값2], ...);`
- **비유:** 회원 가입 양식에 정보를 입력하고 '제출' 버튼을 누르면, 그 정보가 회원 테이블에 한 줄 추가되는 것과 같습니다.

**예시:** `employees` 테이블에 새로운 직원을 추가해 봅시다.

```sql
INSERT INTO employees (employee_id, name, department, salary)
VALUES (101, '홍길동', 'Marketing', 60000);

3. UPDATE: 기존 정보를 최신화하다

UPDATE는 이미 존재하는 데이터 행의 내용을 수정(Update) 하는 데 사용됩니다.

  • 기본 구조: UPDATE [테이블 이름] SET [수정할 열] = [새로운 값] WHERE [조건];

  • 경고! UPDATE 문에서 WHERE 절을 빠뜨리는 것은 재앙의 시작입니다. WHERE가 없으면 테이블의 모든 행이 지정된 값으로 변경됩니다. 이는 마치 ‘김대리’의 주소만 바꿔야 하는데, 전 직원의 주소를 모두 같은 곳으로 바꿔버리는 것과 같습니다. 항상 조심해야 합니다.

예시: 직원 ID가 101인 홍길동의 부서를 ‘Sales’로 변경하고 싶다면?

UPDATE employees
SET department = 'Sales'
WHERE employee_id = 101;

4. DELETE: 데이터와 작별하다

DELETE는 테이블에서 특정 데이터 행을 삭제(Delete) 하는 명령어입니다.

  • 기본 구조: DELETE FROM [테이블 이름] WHERE [조건];

  • 경고! UPDATE와 마찬가지로, WHERE 절이 없는 DELETE는 테이블의 모든 데이터를 삭제합니다. 복구하기 매우 어려우므로 실행 전 반드시 조건을 확인해야 합니다.

예시: 직원 ID가 101인 홍길동의 정보를 삭제하려면?

DELETE FROM employees
WHERE employee_id = 101;

3장: 데이터 정의 언어 (DDL) - 데이터의 집을 짓다

DDL(Data Definition Language)은 데이터의 구조, 즉 스키마(Schema)를 정의하는 명령어들입니다. DML이 집 안의 가구를 배치하고 바꾸는 일이라면, DDL은 집 자체를 짓고, 리모델링하고, 허무는 일에 해당합니다. 데이터가 살게 될 ‘틀’을 만드는 과정이죠.

1. CREATE: 데이터의 뼈대를 세우다

CREATE는 데이터베이스 객체(가장 대표적으로 테이블)를 생성하는 명령어입니다.

  • 기본 구조: CREATE TABLE [테이블 이름] ([열1 이름] [데이터 타입] [제약조건], [열2 이름] [데이터 타입], ...);

  • 비유: 건물의 설계도를 그리는 것과 같습니다. 각 방(열)의 이름과 용도(데이터 타입, 예: VARCHAR는 문자, INT는 숫자), 그리고 규칙(제약조건, 예: PRIMARY KEY는 각 행을 식별하는 유일한 값, NOT NULL은 빈 값을 허용하지 않음)을 정합니다.

예시: 학생 정보를 담을 students 테이블을 만들어 봅시다.

CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    major VARCHAR(50),
    admission_year INT
);

2. ALTER: 구조를 변경하고 확장하다

ALTER는 이미 만들어진 테이블의 구조를 수정하는 데 사용됩니다.

  • 기본 구조:

    • 열 추가: ALTER TABLE [테이블 이름] ADD COLUMN [새 열 이름] [데이터 타입];

    • 열 수정: ALTER TABLE [테이블 이름] MODIFY COLUMN [열 이름] [새 데이터 타입];

    • 열 삭제: ALTER TABLE [테이블 이름] DROP COLUMN [열 이름];

  • 비유: 지어진 집에 새로운 방(열)을 추가하거나, 기존 방의 용도를 바꾸거나, 방을 없애는 리모델링 작업입니다.

예시: students 테이블에 학생의 이메일 주소를 저장할 email 열을 추가해 보겠습니다.

ALTER TABLE students ADD COLUMN email VARCHAR(255);

3. DROP: 구조물을 완전히 철거하다

DROP은 테이블을 포함한 데이터베이스 객체를 완전히 삭제하는 명령어입니다.

  • 기본 구조: DROP TABLE [테이블 이름];

  • 주의! DROP은 테이블의 구조와 데이터를 모두 영구적으로 삭제합니다. DELETE가 테이블 안의 데이터만 지우는 것(집 안의 가구를 모두 치우는 것)이라면, DROP은 집 자체를 폭파시키는 것과 같습니다. 실행에 매우 신중해야 합니다.

예시: students 테이블이 더 이상 필요 없다면,

DROP TABLE students;

4. RENAME: 이름표를 바꾸다

RENAME은 테이블의 이름을 변경하는 명령어입니다.

  • 기본 구조: RENAME TABLE [기존 테이블 이름] TO [새 테이블 이름];

예시: students 테이블의 이름을 university_students로 바꾸고 싶다면,

RENAME TABLE students TO university_students;

4장: 데이터 제어 언어 (DCL) - 데이터의 접근을 통제하다

DCL(Data Control Language)은 데이터에 대한 접근 권한을 제어하는 명령어입니다. 여러 사용자가 동시에 접근하는 데이터베이스 환경에서 보안은 매우 중요합니다. DCL은 누가, 어떤 데이터에, 어떤 작업을 수행할 수 있는지를 정의하는 보안관 역할을 합니다.

1. GRANT: 권한이라는 열쇠를 주다

GRANT는 특정 사용자에게 특정 작업에 대한 권한을 부여하는 명령어입니다.

  • 기본 구조: GRANT [권한 종류] ON [객체] TO [사용자];

  • 비유: 건물의 마스터키를 가진 관리자가 특정 직원에게는 ‘회의실 예약(INSERT)’ 권한만 주고, 다른 직원에게는 ‘회의록 조회(SELECT)’ 권한만 주는 것과 같습니다.

예시: user1이라는 사용자에게 employees 테이블을 조회할 수 있는 권한을 부여하려면,

GRANT SELECT ON employees TO user1;

2. REVOKE: 부여했던 열쇠를 회수하다

REVOKE는 사용자에게 부여했던 권한을 회수하는 명령어입니다.

  • 기본 구조: REVOKE [권한 종류] ON [객체] FROM [사용자];

  • 비유: 퇴사한 직원의 사원증을 회수하여 더 이상 건물에 출입할 수 없도록 막는 것과 같습니다.

예시: user1에게 부여했던 employees 테이블 조회 권한을 회수하려면,

REVOKE SELECT ON employees FROM user1;

5장: 트랜잭션 제어 언어 (TCL) - 작업의 안전성을 보장하다

TCL(Transaction Control Language)은 DML에 의해 수행된 변경 사항들을 하나의 트랜잭션(Transaction) 단위로 묶어 관리하는 명령어입니다. 트랜잭션이란 ‘모두 성공하거나, 아니면 모두 실패해야 하는’ 논리적인 작업 단위를 의미합니다. 데이터의 무결성과 일관성을 지키는 데 결정적인 역할을 합니다.

비유: A의 계좌에서 B의 계좌로 10만 원을 이체하는 상황을 생각해 봅시다.

  1. A 계좌에서 10만 원을 출금한다. (UPDATE)

  2. B 계좌에 10만 원을 입금한다. (UPDATE)

이 두 작업은 반드시 함께 성공해야 합니다. 1번만 성공하고 시스템이 멈춘다면, 10만 원은 공중으로 사라지게 됩니다. 트랜잭션은 이 두 작업을 하나의 묶음으로 처리하여 이런 끔찍한 사태를 막아줍니다.

1. COMMIT: 변경 사항을 확정하다

COMMIT은 트랜잭션 내에서 수행된 모든 작업이 성공적으로 완료되었음을 선언하고, 그 변경 사항을 데이터베이스에 영구적으로 저장하는 명령어입니다.

  • 비유: 온라인 쇼핑에서 ‘결제 확정’ 버튼을 누르는 것과 같습니다. 일단 누르면 되돌리기 어렵습니다.
-- 트랜잭션 시작
UPDATE accounts SET balance = balance - 100000 WHERE account_id = 'A';
UPDATE accounts SET balance = balance + 100000 WHERE account_id = 'B';
COMMIT; -- 모든 변경 사항을 확정하고 저장

2. ROLLBACK: 모든 것을 되돌리다

ROLLBACK은 트랜잭션 내에서 수행된 작업에 문제가 발생했을 경우, 트랜잭션이 시작되기 이전 상태, 즉 마지막 COMMIT 시점으로 모든 것을 되돌리는 명령어입니다.

  • 비유: 장바구니에 물건을 담다가 마음이 바뀌어 ‘전체 취소’를 누르는 것과 같습니다. 모든 것이 원래대로 돌아갑니다.
-- 트랜잭션 시작
UPDATE accounts SET balance = balance - 100000 WHERE account_id = 'A';
-- 여기서 오류 발생!
ROLLBACK; -- A 계좌에서 출금했던 내역을 취소하고 원상 복구

3. SAVEPOINT: 중간 저장 지점을 만들다

SAVEPOINT는 긴 트랜잭션 내에서 중간 저장 지점을 설정하는 명령어입니다. 문제가 발생했을 때 전체를 ROLLBACK하는 대신 특정 SAVEPOINT까지만 되돌릴 수 있게 해줍니다.

  • 비유: 게임에서 보스전을 앞두고 중간 저장을 하는 것과 같습니다. 게임에 지더라도 처음부터 다시 시작할 필요 없이 저장한 지점에서 바로 다시 도전할 수 있습니다.

결론: SQL, 데이터를 다루는 기술의 핵심

지금까지 우리는 SQL이라는 거대한 세계를 구성하는 네 가지 핵심 언어(DML, DDL, DCL, TCL)를 여행했습니다.

  • DML로 데이터와 대화하고,

  • DDL로 데이터가 살 집을 짓고,

  • DCL로 그 집의 보안을 책임지고,

  • TCL로 모든 작업의 안전을 보장했습니다.

SQL은 단순히 오래된 기술이 아닙니다. 빅데이터, 인공지능 시대에도 여전히 가장 신뢰받는 데이터 관리의 근간입니다. NoSQL 데이터베이스가 등장했지만, 많은 경우 SQL과 함께 사용되거나 SQL의 장점을 흡수하고 있습니다.

이 핸드북이 여러분의 SQL 여정에 튼튼한 나침반이 되기를 바랍니다. 여기에 소개된 개념들을 바탕으로 직접 테이블을 만들고 데이터를 넣고, 빼고, 수정하며 질문을 던져보세요. 데이터를 자유자재로 다루는 즐거움을 느끼는 순간, 여러분은 한 단계 더 뛰어난 개발자이자 데이터 전문가로 성장해 있을 것입니다.

레퍼런스(References)

SQL 명령어