본문으로 건너뛰기
SQL 기초집LESSON 03

데이터베이스, 테이블, 자료형

난이도입문 → 초급
예상 시간30분
선수지식이전 강의

3강. 데이터베이스, 테이블, 자료형

1. 이번 강의에서 해결할 문제​

자료형을 선언했는데도 SQLite가 예상 밖 값을 저장할 수 있습니다. SQLite의 동적 타입과 STRICT 테이블을 이해해 데이터 품질을 설계합니다.

2. 학습 목표​

3. 핵심 개념​

SQLite에서 타입은 값에 연결되고 열 선언은 선호 변환 규칙인 affinity를 제공합니다. 일반 테이블은 유연하며 STRICT 테이블은 허용 타입과 변환을 더 엄격히 검사합니다. PostgreSQL은 열마다 정적 타입을 강하게 적용합니다.

테이블은 같은 종류의 기록을 모으고, 열은 각 기록에서 어떤 값을 받을지 정합니다. 예를 들어 점수 열에 플레이어 이름이 들어가면 합계와 정렬이 깨집니다. 자료형은 DBMS가 값의 저장 방식과 허용할 연산을 판단하는 기준이며, 데이터가 어떤 의미를 갖는지 코드 밖에서도 드러냅니다.

자료형을 실제 데이터와 연결하기​

SQLite 저장 클래스담는 값랭킹 데이터 예주의할 점
INTEGER소수점 없는 정수점수, 등수, 공개 여부 0/1아주 큰 수의 범위를 고려
REAL부동소수점 수평균 명중률, 경기 시간모든 소수를 정확히 표현하지 못함
TEXT글자 데이터닉네임, 게임 모드숫자처럼 보여도 문자열이면 계산 의미가 다름
BLOB해석하지 않은 바이트바이너리 페이로드검색할 구조화 데이터 저장에는 부적합
NULL값이 없음아직 정해지지 않은 선택 항목0이나 빈 문자열과 다름

SQLite에는 별도의 BOOLEAN 저장 클래스가 없습니다. 0과 1을 INTEGER로 저장하고 CHECK로 범위를 제한할 수 있습니다. 날짜도 프로젝트 전체에서 ISO-8601 TEXT 또는 Unix timestamp 같은 한 표현을 정해 일관되게 사용해야 합니다.

가장 작은 타입 실험​

SELECT
typeof(3) AS integer_value,
typeof(3.5) AS real_value,
typeof('3.5') AS text_value,
typeof(NULL) AS missing_value;

3.5와 '3.5'는 화면에서는 비슷해 보이지만 전자는 real, 후자는 따옴표로 감싼 text입니다. 타입이 다르면 비교·정렬·계산 결과가 예상과 달라질 수 있습니다.

4. 단계별 SQL 예시​

대상 테이블: 학습 전용 type_lab
파일 경로: C:\dev\game-ranking-db\sql\03-types.sql

예제를 실행하기 전에는 type_lab 테이블이 없습니다. 실행 후에는 자료형과 제약이 정의된 테이블 한 개와 테스트 행 한 개가 생기며, typeof() 조회로 실제 저장 클래스를 확인합니다.

sql/03-types.sql
CREATE TABLE IF NOT EXISTS type_lab (
id INTEGER PRIMARY KEY,
label TEXT NOT NULL,
score REAL NOT NULL,
active INTEGER NOT NULL CHECK (active IN (0, 1)),
payload BLOB
) STRICT;

INSERT INTO type_lab (label, score, active)
VALUES ('ranked', 98.5, 1);

SELECT
label,
typeof(label) AS label_type,
typeof(score) AS score_type,
typeof(active) AS active_type
FROM type_lab;

중요한 줄 해설​

  1. id INTEGER PRIMARY KEY는 각 행을 식별하는 정수 키입니다. SQLite에서는 이 선언이 행 식별자와 특별히 연결됩니다.
  2. label TEXT NOT NULL은 이름을 글자로 저장하고 값 누락을 거부합니다.
  3. score REAL NOT NULL은 소수점 점수를 허용하되 값이 없는 행은 거부합니다.
  4. active INTEGER ... CHECK (active IN (0, 1))은 불리언 의미를 0과 1로 제한합니다.
  5. 마지막 STRICT는 열 선언과 양립할 수 없는 값을 더 일찍 거부합니다.
  6. INSERT는 열 이름과 같은 순서로 'ranked', 98.5, 1을 새 행에 넣습니다. id는 지정하지 않아 자동으로 정해집니다.
  7. typeof()은 스키마 선언이 아니라 현재 행에 실제로 저장된 값의 저장 클래스를 반환합니다.
PowerShell · 실행 순서
sqlite3 .\data\game_ranking.db ".read .\sql\03-types.sql"
sqlite3 .\data\game_ranking.db ".schema type_lab"

예상 결과​

헤더와 상자 출력을 켰다면 핵심 열은 다음과 같습니다.

label label_type score_type active_type
------- ----------- ----------- -----------
ranked text real integer

다음 실패 실험은 기존 데이터를 망가뜨리지 않고 잘못된 값이 거부되는지 확인합니다.

INSERT INTO type_lab (label, score, active)
VALUES ('invalid-active', 50.0, 2);

active가 0 또는 1이 아니므로 CHECK 제약 오류가 나야 정상입니다. 오류는 실습 실패가 아니라 데이터 규칙이 작동한다는 증거입니다.

5. 쿼리가 동작하는 이유​

STRICT 테이블은 SQLite가 지원하는 제한된 타입 이름을 사용하고 손실 없는 변환만 허용합니다. 불리언 전용 저장 클래스가 없으므로 0과 1에 CHECK를 적용합니다. typeof()은 선언형이 아니라 실제 저장된 값의 클래스를 보여 줍니다.

6. 자주 하는 실수와 안전한 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

다음 강의 연결​

자료형만으로는 값의 필수 여부와 범위를 모두 표현할 수 없습니다. 4강. CREATE TABLE과 제약 조건에서 NOT NULL, UNIQUE, CHECK, 키를 조합해 실제 스키마를 만듭니다.

MINI QUIZ

데이터베이스, 테이블, 자료형 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“데이터베이스, 테이블, 자료형” 내용을 실제 작업에 적용한 설명으로 가장 알맞은 것은 무엇인가요?
  2. 문제 2‘날짜 전용 타입을 가정’ 상태에 관한 “데이터베이스, 테이블, 자료형” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

3강. 데이터베이스, 테이블, 자료형 미완료 상태