SQLite 공식 문서: 개념, 예제, 실습
예제 중심의 간결한 SQLite 레퍼런스. 개념을 읽고 코드를 본 뒤 Coddy 여정에서 직접 연습하세요.
SQLite 가이드 학습 시작하기시작하기
- SQLite란SQLite는 별도 서버 없이 애플리케이션 안에서 바로 동작하는 파일 기반 SQL 데이터베이스입니다. 일반 DB 서버와 어떻게 다른지, 어떤 상황에서 진가를 발휘하는지 정리했습니다.
- SQLite vs MySQLSQLite와 MySQL은 구조부터 다릅니다. 아키텍처, 동시성, 데이터 타입, 그리고 어떤 프로젝트에 어떤 DB가 맞는지 실전 기준으로 비교해봅니다.
- SQLite vs PostgresSQLite와 PostgreSQL은 구조부터 동시성, 타입 시스템까지 완전히 다릅니다. 어떤 프로젝트에 어떤 DB가 맞는지 실전 기준으로 정리했습니다.
- SQLite 언제 쓸까SQLite가 정답인 상황과, 차라리 PostgreSQL이나 MySQL로 가야 하는 상황을 실무 관점에서 정리했습니다.
- SQLite 설치Windows, macOS, Linux에서 SQLite를 설치하는 방법을 정리했습니다. CLI 도구 다운로드부터 PATH 등록, 설치 확인까지 한 번에 끝내보세요.
- SQLite CLI터미널을 벗어나지 않고 sqlite3 셸로 DB 열기, 쿼리 실행, 닷 명령어 활용, CSV 가져오기와 내보내기까지 한 번에 정리했습니다.
- GUI 도구SQLite 파일을 열고, 데이터를 살펴보고, 쿼리까지 돌려볼 수 있는 GUI 도구들을 정리했습니다. DB Browser for SQLite, SQLiteStudio, 온라인 뷰어까지 한 번에 비교해 보세요.
- DB 생성SQLite 데이터베이스를 만드는 방법 — 파일 기반이라는 핵심 개념, `sqlite3` 명령어, 그리고 `CREATE DATABASE` 문이 없는 이유까지 정리했습니다.
- 인메모리 DBSQLite 인메모리 데이터베이스가 어떻게 동작하는지, `:memory:`는 언제 쓰는 게 좋은지, 그리고 파일 기반 DB와 어떻게 다른지 정리했습니다.
테이블과 타입
- CREATE TABLESQLite에서 테이블을 만드는 방법을 정리했습니다. 컬럼 정의부터 제약조건, IF NOT EXISTS, 임시 테이블, CREATE TABLE AS SELECT까지 실전 예제로 살펴봅니다.
- 데이터 타입SQLite는 값을 어떻게 저장할까요? 5가지 스토리지 클래스부터 동적 타이핑의 원리, 그리고 Postgres·MySQL에서 넘어온 분들이 자주 걸리는 함정까지 정리했습니다.
- 타입 어피니티SQLite의 타입 어피니티가 어떻게 동작하는지 알아봅니다. 5가지 어피니티 종류와 컬럼 선언에서 어피니티가 결정되는 규칙, 그리고 INTEGER 컬럼에 문자열이 들어갈 수 있는 이유까지 짚어봅니다.
- STRICT 테이블SQLite의 STRICT 테이블을 쓰면 타입 어피니티의 느슨한 동작을 끄고, 선언한 타입과 다른 값은 아예 저장되지 않도록 막을 수 있습니다.
- 기본키SQLite에서 기본키가 어떻게 동작하는지 알아봅니다. 특별한 INTEGER PRIMARY KEY부터 복합키, AUTOINCREMENT, 그리고 초보자가 자주 걸려 넘어지는 함정들까지 짚어봅니다.
- ROWIDSQLite의 숨은 ROWID가 정확히 뭔지, INTEGER PRIMARY KEY로 어떻게 별칭이 되는지, 그리고 WITHOUT ROWID 테이블은 언제 써야 하는지 정리합니다.
- NOT NULL과 DEFAULTSQLite에서 NOT NULL과 DEFAULT가 실제로 무엇을 강제하는지, CURRENT_TIMESTAMP 활용법, 그리고 기존 테이블에 추가할 때 주의할 점까지 한 번에 정리했습니다.
- CHECK 제약조건SQLite의 CHECK 제약조건으로 컬럼 값에 규칙을 거는 방법을 정리했습니다. 단일 컬럼 검사부터 다중 컬럼 검사, 이름 붙이기, 자주 만나는 함정까지 한 번에 살펴봅니다.
- UNIQUE 제약조건SQLite의 UNIQUE 제약조건을 컬럼 단위, 테이블 단위, 복합 키, 그리고 NULL 처리까지 한 번에 정리하고, 제약 위반이 발생했을 때 해결법까지 알아봅니다.
- DROP & ALTER TABLESQLite에서 테이블을 삭제하고 이름을 바꾸고 구조를 변경하는 방법. ALTER TABLE이 지원하는 것과 못 하는 것, 그리고 못 하는 작업을 처리하는 테이블 재생성 패턴까지 한 번에 정리합니다.
데이터 입력과 수정
- INSERTSQLite에서 INSERT INTO로 한 행 또는 여러 행을 넣는 방법, INSERT...SELECT, 기본값 입력, 그리고 OR IGNORE / OR REPLACE로 충돌을 처리하는 방법까지 정리했습니다.
- UPDATESQLite에서 기존 행을 수정하는 방법을 정리했습니다. UPDATE 기본 문법부터 사고를 막아주는 WHERE 절, 여러 컬럼 동시 수정, 그리고 테이블 간 값 복사를 위한 UPDATE ... FROM까지 한 번에 살펴봅니다.
- DELETESQLite DELETE 문 사용법 정리 — WHERE 조건으로 안전하게 행 삭제하기, 전체 행 삭제, ON DELETE CASCADE, 그리고 RETURNING으로 삭제된 행 확인까지.
- UPSERTSQLite에서 UPSERT를 쓰는 방법을 정리했습니다. ON CONFLICT 절, excluded 의사 테이블, DO NOTHING과 DO UPDATE의 차이, 그리고 INSERT OR REPLACE와 뭐가 다른지까지 한 번에 살펴봅니다.
- RETURNING 절SQLite RETURNING 절 사용법 정리. 추가 쿼리 없이 INSERT, UPDATE, DELETE로 변경된 행을 그 자리에서 바로 돌려받는 방법을 예제로 살펴봅니다.
- CSV 임포트SQLite에서 .import 명령어로 CSV 파일을 불러오는 방법을 정리했습니다. 헤더 처리, 기존 테이블에 추가, 구분자 변경, 자주 만나는 에러까지 한 번에 해결해 보세요.
- 데이터 내보내기sqlite3 CLI로 SQLite 데이터를 CSV(헤더 포함), JSON, 전체 SQL 덤프, 그리고 단일 테이블 백업까지 깔끔하게 추출하는 방법을 정리했습니다.
데이터 조회
- SELECT 기본SQLite의 SELECT 문이 실제로 어떻게 동작하는지 정리했습니다. 컬럼 고르기, 표현식 계산, AS로 별칭 붙이기까지 — 앞으로 작성할 모든 쿼리의 토대가 되는 사고방식을 함께 살펴봅니다.
- WHERE 절SQLite의 WHERE 절로 원하는 행만 골라내는 방법을 정리했습니다. 비교 연산자, AND/OR, LIKE, IN, BETWEEN, 그리고 누구나 한 번은 걸리는 NULL 함정까지 다룹니다.
- 연산자와 NULLSQLite에서 NULL을 다룰 때 `=`나 `<>`가 왜 먹히지 않는지, 그리고 IS NULL, IS NOT NULL, COALESCE, IFNULL을 어떻게 써야 하는지 정리했습니다.
- ORDER BYSQLite의 ORDER BY로 결과를 정렬하는 방법을 정리합니다. 오름차순/내림차순, 여러 컬럼으로 정렬, NULL 위치 제어, 대소문자 무시 정렬까지 한 번에 살펴봅니다.
- LIMIT & OFFSETSQLite의 LIMIT과 OFFSET을 제대로 쓰는 법. 결과 행 제한, 행 건너뛰기, 안전한 페이지네이션, 그리고 대용량 테이블에서 빠지기 쉬운 성능 함정까지 한 번에 정리합니다.
- DISTINCTSQLite에서 SELECT DISTINCT가 동작하는 방식을 정리합니다. 단일·다중 컬럼 적용, NULL 처리, COUNT(DISTINCT), 그리고 GROUP BY가 더 나은 상황까지 함께 살펴봅니다.
- CASE 표현식SQLite의 CASE WHEN 표현식을 정리합니다. 단순형과 검색형 차이, SELECT·ORDER BY·WHERE 절에서의 활용, 그리고 IIF가 더 깔끔한 경우까지 살펴봅니다.
함수와 집계
- 문자열 함수SQLite에서 자주 쓰는 문자열 함수들을 한 번에 정리했습니다. SUBSTR, INSTR, REPLACE, TRIM부터 || 연산자로 문자열을 다루는 실전 패턴까지 살펴봅니다.
- 숫자 함수SQLite에서 산술 연산하는 법 — ROUND, ABS, CEIL, FLOOR, MOD, POWER, SQRT, RANDOM과 한 번쯤은 꼭 당하는 정수 나눗셈 함정까지.
- 날짜와 시간SQLite는 날짜를 어떻게 저장하고 다룰까? 5가지 날짜 함수와 포맷 문자열, 수정자(modifier), 그리고 쿼리 성능을 좌우하는 저장 방식까지 한 번에 정리합니다.
- 집계 함수SQLite의 집계 함수가 여러 행을 하나의 값으로 묶는 방식을 정리했습니다. COUNT, SUM, AVG, MIN, MAX부터 GROUP_CONCAT, DISTINCT, FILTER, 그리고 NULL 처리 규칙까지 한 번에 살펴보세요.
- GROUP BY와 HAVINGSQLite에서 GROUP BY로 행을 묶고 HAVING으로 집계 결과를 걸러내는 방법, 그리고 WHERE와 HAVING이 어떻게 다른지 예제로 확실히 짚어봅니다.
관계와 조인
- 외래키SQLite에서 외래키를 어떻게 선언하고, PRAGMA로 제약을 어떻게 켜는지, 그리고 ON DELETE 옵션은 언제 어떤 걸 골라야 하는지 실전 위주로 정리했습니다.
- INNER JOINSQLite의 INNER JOIN 동작 방식부터 ON 절, 3개 테이블 조인, USING 단축 문법까지 한 번에 정리합니다.
- LEFT JOINSQLite에서 LEFT JOIN이 동작하는 방식 — 매칭되지 않은 행을 살리고, NULL을 다루고, 안전하게 필터링하며, 여러 테이블을 조인하는 방법까지 정리했습니다.
- Self JoinSQLite에서 self join이 동작하는 방식을 정리했습니다. 별칭(alias)으로 같은 테이블을 두 번 참조해 사원-관리자처럼 행끼리 짝짓는 예제를 함께 살펴봅니다.
- 서브쿼리SQLite에서 SELECT 안에 SELECT를 중첩하는 방법을 정리했습니다. 스칼라 서브쿼리, IN/EXISTS, 인라인 뷰, 상관 서브쿼리, 그리고 JOIN이 더 나은 경우까지 한 번에 살펴봅니다.
- CTESQLite의 Common Table Expression(CTE)을 활용해 WITH 절로 서브쿼리에 이름을 붙이고, 여러 CTE를 연결해서 위에서 아래로 읽히는 쿼리를 작성하는 방법을 정리했습니다.
- 재귀 CTESQLite의 재귀 CTE를 제대로 이해해 보기 — 앵커/재귀 구조, 부모-자식 트리 순회, 숫자 시퀀스 생성, 그리고 무한 루프를 피하는 방법까지 정리했습니다.
인덱스와 성능
- 인덱스SQLite 인덱스가 어떻게 동작하는지, 언제 도움이 되고 언제 오히려 독이 되는지, 그리고 쿼리 플래너가 실제로 인덱스를 쓰는지 확인하는 방법까지 정리했습니다.
- 복합 인덱스SQLite에서 다중 컬럼 인덱스가 어떻게 동작하는지, 왜 컬럼 순서가 중요한지, 그리고 복합 인덱스가 도움이 될 때와 그저 공간만 낭비할 때를 정리했습니다.
- 부분 인덱스SQLite의 부분 인덱스(Partial Index) 동작 원리와 활용법 — 자주 조회하는 행만 골라서 인덱싱하고, 소프트 삭제·부분 유니크 제약·핫 데이터에 적용하는 패턴까지 정리했습니다.
- EXPLAIN QUERY PLANSQLite EXPLAIN QUERY PLAN으로 쿼리가 인덱스를 타는지 확인하고, SCAN과 SEARCH가 무엇을 의미하는지, 조인 실행 계획은 어떻게 읽는지 정리했습니다.
- ANALYZE & VACUUMSQLite를 빠르고 가볍게 유지해주는 두 명령어 `ANALYZE`와 `VACUUM`. 각각 어떤 일을 하는지, 언제 실행해야 하는지, 알아둘 만한 옵션까지 정리했습니다.
고급 기능
- 트랜잭션SQLite에서 트랜잭션이 어떻게 동작하는지 알아봅니다. BEGIN, COMMIT, ROLLBACK과 자동 커밋 모드, 그리고 락이 걸리는 시점을 결정하는 DEFERRED/IMMEDIATE/EXCLUSIVE 차이까지 정리했어요.
- SAVEPOINTSQLite의 savepoint를 알아봅니다. 트랜잭션 안에 이름표를 찍어두고, 전체를 버리지 않고도 원하는 지점까지만 되돌리는 방법을 정리했습니다.
- 뷰(View)SQLite에서 뷰(View)를 만들고 활용하는 방법을 정리합니다. 복잡한 쿼리를 가상 테이블로 저장하는 방식, 임시 뷰 활용법, 그리고 뷰가 기본적으로 읽기 전용인 이유까지 살펴봅니다.
- 트리거SQLite 트리거의 동작 원리부터 BEFORE/AFTER, 뷰에 쓰는 INSTEAD OF, 그리고 OLD·NEW 행 참조까지 — 트리거가 정답인 상황을 정리했습니다.
- JSON 함수SQLite에서 JSON을 저장하고 조회하는 방법을 정리했습니다. json_extract로 값 꺼내기, json_set으로 수정, json_each로 배열 펼치기, 그리고 JSON 경로 인덱싱까지 다룹니다.
- 전문 검색 (FTS5)SQLite에 FTS5로 전문 검색을 붙이는 방법을 정리했습니다. 가상 테이블 생성부터 MATCH 연산자, BM25 랭킹, 원본 테이블과 인덱스 동기화까지 한 번에 살펴봅니다.
- 윈도우 함수SQLite 윈도우 함수 사용법을 한 번에 정리합니다. OVER, PARTITION BY, 순위 함수, LAG/LEAD, 그리고 누적 합계를 위한 프레임 절까지 예제로 살펴보세요.
- Generated ColumnsSQLite의 generated column을 선언하는 방법부터 VIRTUAL과 STORED 중 무엇을 골라야 하는지, 그리고 인덱스로 빠르게 조회하는 팁까지 정리했습니다.
- ATTACH DATABASEATTACH DATABASE 한 줄이면 여러 SQLite 파일을 하나의 커넥션에 묶어서 스키마 접두사로 조인까지 할 수 있습니다. 사용법과 DETACH 정리까지 정리했습니다.
보안과 애플리케이션 통합
- Prepared StatementSQLite의 prepared statement가 뭔지, 왜 쓰는지, 그리고 모든 드라이버가 감싸고 있는 prepare/bind/step/finalize 라이프사이클을 차근차근 살펴봅니다.
- 파라미터 바인딩SQLite에서 파라미터 바인딩이 어떻게 동작하는지 정리했습니다. 위치 기반 ? 플레이스홀더와 :name 형태의 이름 기반 파라미터, 그리고 값을 안전하게 전달하는 규칙까지 살펴봅니다.
- SQL 인젝션 방지문자열을 이어붙여 쿼리를 만드는 게 왜 위험한지, SQL 인젝션이 실제로 어떻게 동작하는지, 그리고 SQLite의 파라미터 바인딩으로 어떻게 막는지 정리했습니다.
- 앱 연결Python, Node.js, Go, Java에서 SQLite 데이터베이스에 연결하는 방법을 정리했습니다. 파일 경로, 커넥션 문자열, 그리고 처음부터 챙겨두면 좋은 설정까지 한 번에 살펴봅니다.
- 마이그레이션PRAGMA user_version과 순번이 매겨진 마이그레이션 스크립트, 트랜잭션을 활용해 SQLite 스키마를 안전하게 변경하고 롤백까지 가능하게 만드는 방법을 정리했습니다.
- WAL 모드와 동시성SQLite의 WAL(write-ahead logging) 모드를 켜면 읽기와 쓰기가 더 이상 서로를 막지 않습니다. -wal, -shm 파일이 실제로 어떤 일을 하는지 함께 살펴봅니다.
운영과 배포
- 백업과 복구SQLite 데이터베이스를 안전하게 백업하고 복구하는 방법. .backup 명령, VACUUM INTO, 온라인 백업 API, 그리고 그냥 파일을 복사하면 안 되는 이유까지 정리했습니다.
- PRAGMA 설정실제로 성능에 영향을 주는 PRAGMA만 골랐습니다. journal_mode, synchronous, foreign_keys, busy_timeout, cache_size를 운영 환경에 맞게 설정하는 방법을 정리했습니다.
- 자주 발생하는 에러실무에서 진짜 마주치는 SQLite 에러들 — database is locked, readonly database, disk image malformed, 제약조건 위반까지 원인과 해결법을 한 번에 정리합니다.