Dechive Logo
Dechive
Dev#sql#database#relational-database#rdbms#data-type#char#varchar

SQL 완전 정복 2편: 관계형 데이터베이스와 SQL의 모든 것 — 정의부터 데이터 타입까지

데이터베이스의 정의, 역사, 관계형 DB의 특징, SQL의 탄생과 명령문 종류, 테이블과 데이터 타입까지 한 번에 정리

들어가며

1편에서 데이터 모델링의 개념과 ERD를 다뤘습니다. 데이터를 어떻게 구조화할지 설계하는 방법이었죠.

이번 편은 그 설계를 실제로 구현하는 공간, 데이터베이스로 들어갑니다. 데이터베이스가 무엇인지, 어떻게 발전해왔는지, 그리고 우리가 매일 쓰는 SQL이 어디서 왔는지를 처음부터 정리합니다.


1. 데이터베이스란 무엇인가 — 정의가 왜 여러 개인가

데이터베이스를 한 줄로 정의하면 쉬울 것 같지만, 실제로는 관점에 따라 정의가 달라집니다. 각 정의가 무엇을 강조하는지 이해하면 데이터베이스의 본질이 보입니다.

정의 1: 통합된 데이터(Integrated Data)

여러 곳에 흩어진 데이터를 하나로 모아 중복을 최소화한 것입니다. 같은 데이터가 여러 파일에 따로따로 저장되면 업데이트할 때 하나를 빠뜨리는 순간 데이터가 엇갈립니다. 데이터베이스는 이 중복을 통제합니다.

정의 2: 저장된 데이터(Stored Data)

컴퓨터가 접근할 수 있는 저장 매체에 기록된 데이터입니다. 사람의 머릿속이나 종이 장부가 아닌, 디스크나 메모리에 물리적으로 저장되어 있어야 합니다.

정의 3: 운영 데이터(Operational Data)

단순히 저장만 하는 게 아니라, 조직의 업무를 수행하는 데 반드시 필요한 데이터입니다. 임시로 만든 파일이나 테스트용 더미 데이터가 아닌, 실제 비즈니스에 사용되는 데이터입니다.

정의 4: 공용 데이터(Shared Data)

여러 사용자와 애플리케이션이 함께 사용하는 데이터입니다. 혼자만 쓰는 엑셀 파일과 달리, 데이터베이스는 동시에 여러 명이 접근하고 수정할 수 있어야 합니다.

정의를 합치면

데이터베이스란, 여러 사람이 공유하고 사용할 목적으로 통합 관리되는 데이터의 집합이다.

이 정의가 가장 포괄적입니다. 핵심은 공유, 통합, 관리 세 단어입니다.


2. 데이터베이스의 발전 연혁

데이터베이스가 처음부터 지금 같은 모습이었던 건 아닙니다. 수십 년에 걸쳐 진화했습니다.

1960년대: 파일 시스템 시대

컴퓨터가 데이터를 저장하는 방식은 처음엔 단순한 파일이었습니다. 각 프로그램이 자신만의 파일을 만들어 데이터를 저장했습니다. 문제는 명확했습니다. 파일마다 같은 데이터가 중복으로 저장되고, 프로그램이 바뀌면 파일 구조도 같이 바꿔야 했습니다. 데이터와 프로그램이 강하게 결합된 구조였습니다.

1960년대 후반: 최초의 DBMS 등장

IBM이 IMS(Information Management System) 를 개발하면서 본격적인 데이터베이스 시대가 시작됩니다. IMS는 계층형 모델(Hierarchical Model)을 사용했습니다. 데이터를 트리 구조로 저장하는 방식으로, 부모-자식 관계가 명확한 데이터에는 효율적이었습니다. 아폴로 달 탐사 프로젝트의 부품 관리에 처음 사용됐습니다.

1970년대: 관계형 모델의 등장

1970년, IBM 연구원 에드거 F. 코드(Edgar F. Codd) 가 논문 하나를 발표합니다.

"A Relational Model of Data for Large Shared Data Banks"

이 논문이 데이터베이스의 역사를 바꿉니다. 데이터를 트리나 그래프가 아닌 표(테이블) 형태로 저장하고, 수학적 집합론을 기반으로 데이터를 다루는 관계형 모델을 제안했습니다. 이론이 나왔지만 실제 구현은 아직이었습니다.

1970년대 후반~1980년대: SQL과 상용 RDBMS의 탄생

코드의 이론을 바탕으로 IBM이 System R 프로젝트를 시작하고, 여기서 SQL(Structured Query Language) 의 전신인 SEQUEL이 탄생합니다. 이후 Oracle이 최초의 상용 관계형 데이터베이스를 출시하고, IBM의 DB2가 뒤를 잇습니다. 관계형 데이터베이스가 표준으로 자리잡기 시작합니다.

1990년대: RDBMS의 전성기

Oracle, MySQL, PostgreSQL, Microsoft SQL Server 등이 등장하며 관계형 데이터베이스가 기업 IT 인프라의 핵심이 됩니다. SQL이 ANSI/ISO 표준으로 제정되며 언어의 통일성이 생깁니다.

2000년대 이후: NoSQL의 등장과 공존

인터넷이 폭발적으로 성장하면서 기존 RDBMS로는 처리하기 어려운 대규모 비정형 데이터가 쏟아집니다. Google, Amazon, Facebook이 자체 분산 데이터베이스를 개발하고, MongoDB, Redis, Cassandra 같은 NoSQL 데이터베이스가 등장합니다. 관계형 DB가 사라진 게 아니라, 용도에 맞게 선택하는 시대가 됐습니다.


3. 관계형 데이터베이스의 특징

관계형 데이터베이스(RDBMS: Relational Database Management System)가 50년 넘게 살아남은 데는 이유가 있습니다.

특징 1: 데이터를 테이블로 표현한다

모든 데이터는 행(Row)과 열(Column)으로 이루어진 테이블에 저장됩니다. 직관적이고 이해하기 쉽습니다. 엑셀을 다뤄본 사람이라면 테이블의 구조가 낯설지 않습니다.

특징 2: 데이터 간의 관계를 정의한다

테이블은 서로 독립적으로 존재하는 게 아니라, 외래 키(Foreign Key) 를 통해 연결됩니다. 고객 테이블과 주문 테이블이 고객 ID로 연결되는 식입니다. 이 관계가 복잡한 데이터 구조를 유연하게 표현하게 해줍니다.

특징 3: SQL이라는 표준 언어를 사용한다

데이터를 조회, 삽입, 수정, 삭제하는 데 SQL이라는 표준 언어를 씁니다. Oracle에서 배운 SQL이 MySQL에서도, PostgreSQL에서도 대부분 그대로 통합니다. 데이터베이스가 바뀌어도 언어를 새로 배울 필요가 없습니다.

특징 4: 무결성을 보장한다

데이터 무결성(Data Integrity) 이란 데이터가 항상 정확하고 일관된 상태를 유지하는 것입니다. RDBMS는 다양한 제약 조건(Constraint)을 통해 이를 강제합니다.

  • 기본 키(Primary Key): 각 행을 고유하게 식별
  • 외래 키(Foreign Key): 테이블 간 관계의 일관성 유지
  • NOT NULL: 빈 값 방지
  • UNIQUE: 중복 값 방지

특징 5: 트랜잭션을 지원한다

트랜잭션(Transaction) 은 "모두 성공하거나, 모두 실패하거나"를 보장하는 작업 단위입니다. 계좌 이체를 예로 들면 — A 계좌에서 돈이 빠져나가고 B 계좌에 입금되는 두 작업이 반드시 함께 성공해야 합니다. 중간에 오류가 나면 둘 다 취소됩니다. 이것이 ACID 원칙입니다.

  • Atomicity(원자성): 전부 성공 또는 전부 실패
  • Consistency(일관성): 트랜잭션 전후 데이터 무결성 유지
  • Isolation(격리성): 동시 실행 트랜잭션이 서로 영향 안 줌
  • Durability(지속성): 완료된 트랜잭션은 영구 반영

4. SQL의 탄생 배경과 특징

SQL은 어디서 왔는가

1970년 코드의 관계형 모델 논문 이후, IBM은 이를 실제로 구현하는 System R 프로젝트를 시작합니다. 이 과정에서 데이터를 다루기 위한 언어가 필요했고, SEQUEL(Structured English Query Language) 이 개발됩니다. 이후 상표권 문제로 이름이 SQL(Structured Query Language) 로 바뀝니다.

1986년 ANSI, 1987년 ISO에서 SQL을 표준으로 채택하면서 데이터베이스 언어의 공용어가 됩니다.

SQL의 특징

1. 비절차적 언어(Non-Procedural Language)

"어떻게 가져올지"가 아니라 "무엇을 가져올지" 를 명시합니다. 일반 프로그래밍 언어는 데이터를 가져오기 위한 루프, 조건문, 포인터 조작을 직접 작성해야 합니다. SQL은 원하는 결과만 선언하면 DBMS가 알아서 최적의 방법을 찾습니다.

-- "20세 이상 고객의 이름과 이메일을 가져와"
-- 어떻게 찾을지는 DBMS가 결정
SELECT name, email FROM customers WHERE age >= 20;

2. 집합 지향(Set-Oriented)

SQL은 데이터를 한 건씩이 아니라 집합 단위로 처리합니다. 조건에 맞는 모든 행을 한 번에 가져오고, 한 번에 수정하고, 한 번에 삭제합니다.

3. 대소문자 구분 없음

SELECTselect는 같습니다. 관례적으로 SQL 예약어는 대문자로 쓰는 경우가 많지만 강제는 아닙니다.

4. 표준이 있지만 방언이 존재

ANSI SQL이 표준이지만, Oracle의 PL/SQL, Microsoft의 T-SQL, MySQL의 방언 등 각 DBMS마다 고유한 확장 문법이 있습니다. 기본 문법은 대부분 호환되지만 고급 기능에서 차이가 납니다.


5. SQL 명령문의 종류

SQL 명령문은 목적에 따라 네 가지로 분류됩니다.

DDL (Data Definition Language) — 데이터 정의어

테이블, 인덱스, 뷰 등 데이터베이스 구조를 정의하는 명령어입니다.

명령어설명
CREATE새 테이블, 데이터베이스 생성
ALTER기존 구조 수정 (컬럼 추가/삭제 등)
DROP테이블, 데이터베이스 삭제
TRUNCATE테이블 구조는 유지하고 데이터만 전부 삭제
CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  email VARCHAR(100) UNIQUE
);

DDL은 자동으로 커밋됩니다. 실행 취소가 안 됩니다. DROP은 신중하게.

DML (Data Manipulation Language) — 데이터 조작어

테이블 안의 데이터를 조회, 삽입, 수정, 삭제하는 명령어입니다. 실무에서 가장 많이 쓰입니다.

명령어설명
SELECT데이터 조회
INSERT데이터 삽입
UPDATE데이터 수정
DELETE데이터 삭제
-- 조회
SELECT * FROM users WHERE age > 20;

-- 삽입
INSERT INTO users (id, name, email) VALUES (1, '홍길동', 'hong@email.com');

-- 수정
UPDATE users SET email = 'new@email.com' WHERE id = 1;

-- 삭제
DELETE FROM users WHERE id = 1;

DCL (Data Control Language) — 데이터 제어어

데이터베이스에 대한 접근 권한을 제어하는 명령어입니다.

명령어설명
GRANT권한 부여
REVOKE권한 회수
-- 사용자에게 SELECT 권한 부여
GRANT SELECT ON users TO 'john'@'localhost';

-- 권한 회수
REVOKE SELECT ON users FROM 'john'@'localhost';

TCL (Transaction Control Language) — 트랜잭션 제어어

트랜잭션을 제어하는 명령어입니다. DCL에 포함시키는 분류도 있지만 별도로 구분하는 경우가 많습니다.

명령어설명
COMMIT트랜잭션 확정 (영구 반영)
ROLLBACK트랜잭션 취소 (변경사항 되돌림)
SAVEPOINT롤백 지점 설정
BEGIN;
UPDATE accounts SET balance = balance - 10000 WHERE id = 1;
UPDATE accounts SET balance = balance + 10000 WHERE id = 2;
COMMIT; -- 둘 다 성공하면 확정
-- 오류 시: ROLLBACK; -- 둘 다 취소

6. 테이블이란 무엇인가

관계형 데이터베이스에서 모든 데이터는 테이블(Table) 에 저장됩니다. 테이블은 가장 기본적인 데이터 저장 단위입니다.

테이블의 구성 요소

┌──────┬──────────┬─────────────────────┬─────┐
│  id  │   name   │        email        │ age │  ← 열(Column / Field / Attribute)
├──────┼──────────┼─────────────────────┼─────┤
│  1   │ 홍길동   │ hong@example.com    │ 28  │  ←  행(Row / Record / Tuple)
│  2   │ 김철수   │ kim@example.com     │ 35  │
│  3   │ 이영희   │ lee@example.com     │ 22  │
└──────┴──────────┴─────────────────────┴─────┘
  • 열(Column): 데이터의 속성을 정의합니다. 각 열은 이름과 데이터 타입을 가집니다.
  • 행(Row): 실제 데이터 한 건입니다. 각 행은 테이블의 모든 열에 대한 값을 가집니다.
  • 셀(Cell): 행과 열이 교차하는 하나의 값입니다.

테이블 설계 시 중요한 개념

기본 키(Primary Key): 각 행을 고유하게 식별하는 열입니다. 중복될 수 없고, NULL이 될 수 없습니다. 위 예시에서 id가 기본 키 역할을 합니다.

외래 키(Foreign Key): 다른 테이블의 기본 키를 참조하는 열입니다. 테이블 간의 관계를 만듭니다.

-- orders 테이블의 user_id는 users 테이블의 id를 참조
CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  user_id INT,
  product VARCHAR(100),
  FOREIGN KEY (user_id) REFERENCES users(id)
);

7. 데이터 타입 — 중요성과 종류

왜 데이터 타입이 중요한가

열을 정의할 때 반드시 데이터 타입(Data Type) 을 지정해야 합니다. 데이터 타입은 단순히 형식을 맞추는 게 아닙니다.

1. 저장 공간 효율: 숫자를 문자로 저장하면 불필요하게 공간을 낭비합니다.

2. 연산 정확성: 숫자 타입이어야 수학 연산이 가능합니다. 문자로 저장된 "10""9"를 비교하면 문자열 기준으로 "9" > "10"이 됩니다.

3. 인덱스 성능: 적절한 타입을 쓸수록 인덱스가 더 효율적으로 작동합니다.

4. 데이터 무결성: 날짜 타입 열에 "안녕하세요"가 들어가는 걸 자동으로 막아줍니다.

주요 데이터 타입

숫자형

타입설명범위
INT / INTEGER정수약 ±21억
BIGINT큰 정수약 ±920경
DECIMAL(p, s)고정 소수점금액 계산에 사용
FLOAT / DOUBLE부동 소수점근사값, 과학 계산

금액은 반드시 DECIMAL을 쓰세요. FLOAT는 부동 소수점 오차 때문에 0.1 + 0.2 = 0.30000000000000004 같은 문제가 생깁니다.

문자형

타입설명
CHAR(n)고정 길이 문자열
VARCHAR(n)가변 길이 문자열
TEXT길이 제한 없는 긴 문자열

날짜/시간형

타입설명예시
DATE날짜만2026-04-09
TIME시간만14:30:00
DATETIME날짜 + 시간2026-04-09 14:30:00
TIMESTAMPDATETIME + 시간대자동 현재 시간 기록 가능

불리언형

타입설명
BOOLEAN / BOOL참/거짓 (MySQL에선 TINYINT(1)로 처리)

8. CHAR vs VARCHAR — 언제 무엇을 쓰는가

가장 자주 헷갈리는 타입입니다. 둘 다 문자열을 저장하지만 동작 방식이 다릅니다.

CHAR(n) — 고정 길이

선언한 길이 n항상 고정으로 차지합니다. 실제 데이터가 짧아도 나머지는 공백으로 채웁니다.

-- CHAR(10)에 'ABC' 저장 시
-- 'ABC       ' (7자리 공백 추가, 총 10바이트 사용)

언제 쓰는가:

  • 길이가 항상 일정한 데이터 — 주민등록번호(13자리), 국가 코드(KR, US), 성별 코드(M, F)
  • 짧고 길이가 고정된 코드 값

장점: 고정 길이라 저장과 조회 속도가 빠릅니다. 인덱스 성능도 좋습니다.

VARCHAR(n) — 가변 길이

실제 데이터 길이만큼만 저장합니다. 대신 길이 정보를 별도로 저장하는 오버헤드가 있습니다.

-- VARCHAR(100)에 'ABC' 저장 시
-- 'ABC' + 길이 정보 (약 3~4바이트 사용)

언제 쓰는가:

  • 길이가 들쑥날쑥한 데이터 — 이름, 이메일, 주소, 제목
  • 대부분의 일반적인 문자열 데이터

장점: 저장 공간 효율적입니다.

한눈에 비교

구분CHAR(10)VARCHAR(10)
'A' 저장 시10바이트2바이트 (1 + 길이1)
'ABCDEFGHIJ' 저장 시10바이트11바이트 (10 + 길이1)
속도약간 빠름약간 느림
공간 효율낮음높음
적합한 데이터고정 길이 코드일반 문자열

실무 판단 기준

길이가 항상 같은가?
  → YES: CHAR
  → NO:  VARCHAR

데이터 길이가 255자를 넘을 수 있는가?
  → YES: TEXT
  → NO:  VARCHAR

마치며

데이터베이스는 단순한 저장소가 아닙니다. 코드의 이론에서 출발해, SQL이라는 언어로 구체화되고, 테이블과 데이터 타입이라는 구조로 데이터를 담습니다.

이 편에서 다룬 내용은 SQL을 배우기 위한 가장 기본적인 토대입니다. 다음 편에서는 실제로 테이블을 만들고, 데이터를 조회하고, 조건을 걸고, 여러 테이블을 연결하는 실전 SQL 문법을 다룹니다.

사서Dechive 사서