부록 · 빠른 참조와 진단
← 7부 다음 단계 · 목차
곁에 두고 펼쳐 보는 참조 모음입니다. 명령어 빠른 참조, 증상→처방 진단표, 치트시트, 용어집, 공식 문서 링크 순입니다.
A. SQL 명령어 빠른 참조
테이블 다루기 (DDL)
SQL
CREATE TABLE 이름 (열 타입 제약, ...); -- 표 생성 ALTER TABLE 이름 ADD COLUMN 열 타입; -- 열 추가 DROP TABLE IF EXISTS 이름; -- 표 삭제(구조+데이터)
데이터 다루기 (DML)
SQL
INSERT INTO 표 (열1, 열2) VALUES (값1, 값2); -- 추가 INSERT INTO 표 (열) VALUES (값1), (값2), (값3); -- 여러 행 UPDATE 표 SET 열 = 값 WHERE 조건; -- 수정 DELETE FROM 표 WHERE 조건; -- 삭제
조회 (Query) — 쓰는 순서
SQL
SELECT 열, 집계함수 FROM 표 JOIN 다른표 ON 연결조건 WHERE 행조건 GROUP BY 묶음기준 HAVING 그룹조건 ORDER BY 정렬기준 [ASC|DESC] LIMIT 개수 [OFFSET 건너뛸수];
실행 순서 (외우면 오류가 줄어든다)
CODE
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
운영
SQL
BEGIN; ... COMMIT; -- 트랜잭션 확정 BEGIN; ... ROLLBACK; -- 트랜잭션 취소 CREATE INDEX 이름 ON 표(열); -- 인덱스 CREATE VIEW 이름 AS SELECT ...; -- 뷰 PRAGMA foreign_keys = ON; -- 외래키 검사 켜기(SQLite) EXPLAIN QUERY PLAN SELECT ...; -- 실행 계획 진단(SQLite)
B. 증상 → 원인 → 처방 진단표
쿼리가 뜻대로 안 될 때 펼쳐 보세요.
| 증상 | 흔한 원인 | 처방 |
|---|---|---|
| 결과가 항상 비어 있음 | = NULL로 비교 | IS NULL / IS NOT NULL 사용 (2부) |
| 결과가 비정상적으로 많음(폭증) | JOIN에 ON 누락 → 카티전 곱 | ON으로 연결 조건 명시 (5부) |
| 행이 전부 바뀌거나 사라짐 | UPDATE/DELETE에 WHERE 누락 | 먼저 같은 WHERE로 SELECT 확인 (3부) |
no such column 오류 | 별칭 미사용으로 칸 모호, 오타 | 표.칸 으로 한정, 철자 확인 |
ambiguous column name 오류 | 여러 표에 같은 칸 이름 | c.id처럼 별칭으로 구분 (5부) |
WHERE에서 별칭 못 씀 | 실행 순서상 WHERE가 SELECT보다 먼저 | WHERE엔 원래 식, 또는 서브쿼리 (4부) |
집계 조건이 WHERE에서 오류 | 그룹 조건을 WHERE에 씀 | HAVING 사용 (5부) |
FOREIGN KEY constraint failed | 존재하지 않는 대상 참조 | 부모 행 먼저 삽입, 참조값 확인 (3부) |
UNIQUE constraint failed | 중복 값 삽입 | 기존 값 확인, 필요시 UPDATE |
NOT NULL constraint failed | 필수 칸을 비움 | 값 제공 또는 DEFAULT 설정 |
| 외래키 위반이 안 막힘 | PRAGMA foreign_keys=ON 안 함 | 연결마다 PRAGMA 실행 (3부) |
| 파이썬에서 변경이 저장 안 됨 | commit() 누락 | conn.commit() 또는 with conn: (7부) |
| 쿼리가 느림 | 전체 스캔(SCAN) | EXPLAIN QUERY PLAN 확인 후 인덱스 (6부) |
한글 LIKE 대소문자 이상 | LIKE의 유니코드 한계 | 정밀 검색은 전문 검색 도구 고려 (4부) |
C. 치트시트
C-1. SQLite 데이터 타입
| 타입 | 담는 것 | 비고 |
|---|---|---|
INTEGER | 정수 | INTEGER PRIMARY KEY는 자동증가 |
REAL | 소수(실수) | |
TEXT | 글자 | 날짜도 여기에 '2026-01-03' 형식으로 |
BLOB | 이진 데이터 | 입문에선 거의 안 씀 |
NULL | 값 없음 | 0·''과 다름 |
C-2. 제약조건
| 제약 | 뜻 |
|---|---|
PRIMARY KEY | 유일 + 비어있지않음 (행의 대표) |
NOT NULL | 빈 값 금지 |
UNIQUE | 중복 금지 |
DEFAULT v | 값 없으면 v로 |
CHECK (조건) | 조건 만족 값만 |
FOREIGN KEY ... REFERENCES | 다른 표에 존재하는 값만 |
C-3. 비교·논리 연산자
| 연산 | 뜻 |
|---|---|
= <>(!=) | 같다 / 다르다 |
< <= > >= | 대소 |
AND OR NOT | 논리 결합 |
IN (a,b,c) | 목록 중 하나 |
BETWEEN a AND b | 범위(양 끝 포함) |
LIKE '패턴' | 패턴 매칭(%=0+글자, _=1글자) |
IS NULL / IS NOT NULL | 빈 값 여부 |
C-4. 집계 함수
| 함수 | 하는 일 |
|---|---|
COUNT(*) | 행 수(NULL 포함) |
COUNT(칸) | NULL 아닌 값의 수 |
COUNT(DISTINCT 칸) | 고유 값의 수 |
SUM AVG | 합계 / 평균 |
MIN MAX | 최소 / 최대 |
C-5. 자주 쓰는 SQLite 함수
| 함수 | 예 | 결과 |
|---|---|---|
upper / lower | upper('abc') | ABC |
length | length('모비딕') | 3 |
COALESCE(a,b) | COALESCE(author,'미상') | a가 NULL이면 b |
date('now') | 오늘 날짜 | |
strftime('%Y',날짜) | strftime('%Y','2026-01-03') | 2026 |
C-6. 선택 가이드 (개관)
어느 것도 "유일한 정답"은 아닙니다. 개념을 먼저, 도구는 필요에 맞춰.
| 갈림길 | 단순/입문 | 확장 시 고려 |
|---|---|---|
| 데이터베이스 | SQLite (무설치·로컬·읽기위주) | PostgreSQL·MySQL (동시쓰기·서버·대용량) |
| 기본키 | 인공 id(대리키) | 자연키는 신중히 |
| 관계 | 외래키로 명시 | 다대다는 중간 표 |
| 빠르게 | 느려진 뒤 인덱스 | 측정 후 병목에만 |
| 파이썬 접근 | 표준 sqlite3 | ORM(SQLAlchemy 등) |
D. 용어집
- 데이터베이스(database) — 데이터를 구조화해 저장·관리·조회하는 시스템.
- 관계형 데이터베이스(relational database) — 데이터를 표(테이블)로 나누고 관계로 잇는 방식. SQLite·PostgreSQL·MySQL 등.
- SQL(Structured Query Language) — 관계형 데이터베이스에 묻고 조작하는 표준 언어.
- 테이블(table) — 같은 종류 대상을 모은 표. 행(row/record) = 한 대상, 열(column) = 한 종류 정보.
- 기본키(primary key) — 각 행을 유일하게 구별하는 대표값. 비어있을 수 없음.
- 외래키(foreign key) — 다른 표의 기본키를 가리키는 칸. 표를 잇는다.
- 제약조건(constraint) — 잘못된 데이터를 막는 규칙(
NOT NULL·UNIQUE·CHECK등). - NULL — "값 없음"이라는 특별한 상태. 0·빈 글자와 다름.
- 정규화(normalization) — 중복을 줄이려 데이터를 여러 표로 나누는 설계 원칙.
- JOIN — 여러 표를 연결 조건으로 합치는 것.
INNER(양쪽 다)·LEFT(왼쪽 다). - 집계 함수(aggregate function) — 여러 행을 한 값으로 요약(
COUNT·SUM·AVG등). - GROUP BY — "~별"로 묶어 집계. HAVING — 묶은 그룹을 거름.
- 서브쿼리(subquery) — 다른 쿼리 안에 들어간 쿼리.
- 윈도우 함수(window function) — 행을 접지 않고 순위·누계를 덧붙이는 함수(
OVER). - 트랜잭션(transaction) — 여러 변경을 "전부 되거나 전부 안 되거나"로 묶는 단위.
- ACID — 트랜잭션의 보장: 원자성·일관성·격리성·지속성.
- 무결성(integrity) — 데이터가 어긋나지 않게 지켜지는 성질(개체·참조·도메인).
- 인덱스(index) — 칸 값을 미리 정렬해 둔 색인. 조회를 빠르게.
- 뷰(view) — 저장된 쿼리이자 가상 테이블. 복잡한 쿼리 재사용.
- SQL 인젝션(SQL injection) — 입력이 SQL 명령으로 해석되는 보안 취약점.
?바인딩으로 방지. - NoSQL — 표가 아닌 다른 모양(문서·키값·그래프·검색)의 데이터베이스 총칭.
- DDL / DML — 구조를 다루는 명령(
CREATE등) / 데이터를 다루는 명령(INSERT등).
E. 더 배울 거리 (공식 문서)
추측이 아니라 1차 출처를 권합니다. 버전에 따라 세부가 바뀌니, 막히면 공식 문서를 보는 습관을 들이세요.
- SQLite 공식 문서 —
https://www.sqlite.org/docs.html(SQL 문법·함수·PRAGMA의 권위 있는 출처) - SQLite 지원 SQL 구문 —
https://www.sqlite.org/lang.html - 파이썬 sqlite3 모듈 —
https://docs.python.org/3/library/sqlite3.html - pandas 입출력(read_sql 등) —
https://pandas.pydata.org/docs/ - PostgreSQL 공식 문서 —
https://www.postgresql.org/docs/(서버형으로 넘어갈 때) - MySQL 공식 문서 —
https://dev.mysql.com/doc/ - DB Browser for SQLite —
https://sqlitebrowser.org/(GUI 도구) - 연습용 공개 데이터 — 공공데이터포털, 캐글(Kaggle) 등에서 CSV를 받아
to_sql로 넣어 연습
F. 마치며
이 안내서는 SQL을 처음 만나는 사람이 손으로 직접 쳐 보며 데이터베이스의 핵심을 익히도록 설계했습니다. 작은 서점 하나를 만들며 설계·입력·질의·운영·코드를 한 바퀴 돌았습니다. 여기서 배운 개념은 어느 데이터베이스로 가든 토대가 됩니다.
가장 중요한 한 가지를 다시 말하면: 실제 데이터로 질문을 던지는 연습이 최고의 스승입니다. 관심 있는 데이터를 SQLite에 넣고, 궁금한 것을 SQL로 물어보세요. 막히면 이 부록으로 돌아오세요. 즐거운 쿼리 되시길 바랍니다.
← 7부 다음 단계 · 목차