SQLite ドキュメント
簡潔で実例中心の SQLite リファレンス。概念を読み、コードを見て、Coddy のジャーニーで実践しましょう。
SQLite のガイド付き学習を始めるはじめに
- SQLiteとはSQLiteは、サーバーを立てずにアプリの中で動く、ファイル1つで完結するSQLデータベースです。普通のDBサーバーとの違いや、どんな場面で活躍するのかを解説します。
- SQLite vs MySQLSQLiteとMySQLは何がどう違うのか。アーキテクチャ、同時実行性、データ型、そしてどんなプロジェクトに向いているかを実例ベースで整理します。
- SQLite vs PostgresSQLiteとPostgreSQLの違いを、アーキテクチャ・並行処理・型システム・向いている用途の観点から実務目線で整理します。
- SQLiteの使いどころSQLiteを選ぶべき場面と、PostgresやMySQLに切り替えたほうがいい場面を、実際のユースケースから整理します。
- SQLiteのインストールWindows・macOS・Linuxそれぞれで`sqlite3`コマンドラインツールを導入し、PATHを通して動作確認するまでの手順をまとめました。
- SQLite CLIターミナルだけで完結する`sqlite3`コマンドラインシェルの使い方を解説。データベースのオープン、ドットコマンド、SQLファイルの実行、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独特の「型親和性(Type Affinity)」のしくみを解説。5つの親和性、CREATE TABLEから親和性が決まるルール、そして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制約で、列の値に対するルールをDB側で強制する方法を解説。単一列・複数列のチェック、名前付き制約、NULL周りのハマりどころまで実例で紹介します。
- UNIQUE制約SQLiteのUNIQUE制約を実例で解説。カラム単位・テーブル単位の書き方、複合ユニークキー、NULLが複数入る理由、エラー発生時の対処までまとめます。
- DROP・ALTER TABLESQLiteでテーブルを削除・リネーム・変更する方法を解説。ALTER TABLEで何ができて何ができないのか、対応していない変更を行うためのテーブル再構築パターンまで紹介します。
データの追加と更新
- INSERTSQLiteのINSERT文を実例で解説。1行挿入から複数行の一括挿入、INSERT...SELECT、デフォルト値の挿入、OR IGNORE / OR REPLACEによる重複制御まで一気に押さえます。
- UPDATE文SQLiteで既存レコードを更新する方法をまとめました。基本のUPDATE構文、事故を防ぐWHERE句、複数カラムの一括更新、そしてテーブルを跨いで更新できるUPDATE ... FROMまで実例付きで解説します。
- DELETESQLiteのDELETE文の基本から、WHERE句で安全に絞り込む書き方、全件削除、ON DELETE CASCADEでの連鎖削除、RETURNINGで削除した行を取得する方法まで実例で解説します。
- UPSERTSQLiteのUPSERTを実例で解説。ON CONFLICT DO UPDATE / DO NOTHINGの書き分け、excluded疑似テーブルの正体、INSERT OR REPLACEとの違いまでまとめます。
- RETURNING句SQLiteのRETURNING句を使えば、INSERT・UPDATE・DELETEで操作した行をその場で取得できます。追加クエリ不要で結果を受け取る方法を実例で解説。
- CSVインポートSQLiteの.importコマンドでCSVを取り込む手順を解説。ヘッダー行の扱い、既存テーブルへの追加、区切り文字の指定、よくあるエラーの対処法までまとめました。
- データのエクスポートsqlite3 コマンドラインシェルを使って、CSV(ヘッダー付き)、JSON、SQLダンプ、テーブル単位のバックアップなど、SQLite からデータを取り出す方法をまとめて解説します。
データの取得
- 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 を実例で解説。ASC / DESC の指定、複数列での並び替え、NULL の位置制御、COLLATE NOCASE による大文字小文字を区別しないソートまで一気に押さえます。
- LIMITとOFFSETSQLiteのLIMITとOFFSETの使い方を実例で解説。行数の制限、スキップ、安全なページング、そして大きなテーブルで陥りがちなパフォーマンスの落とし穴まで押さえます。
- DISTINCTSQLiteのSELECT DISTINCTの基本から、複数カラム指定、NULLの扱い、COUNT(DISTINCT)、GROUP BYとの使い分けまでを実例で整理します。
- CASE式SQLiteのCASE式を基本から解説。単純CASEと検索CASEの違い、SELECTやORDER BY、WHEREでの使い方、IIFとの使い分けまでまとめました。
関数と集約
- 文字列関数SQLiteの文字列関数を実例で整理。`||`での連結、SUBSTR・INSTR・REPLACE・TRIMを使ったテキスト整形のパターンをまとめました。
- 数値関数SQLiteで数値計算をするための基本ガイド。ROUND・ABS・CEIL・FLOOR・MOD・POWER・SQRT・RANDOMの使い方と、誰もが一度はハマる整数除算の落とし穴まで解説します。
- 日付と時刻SQLite には専用の日付型がありません。本記事では date()、datetime()、strftime() の使い分けから modifier による日付計算、保存形式の選び方までを実例で解説します。
- 集計関数SQLiteの集計関数で複数行を1つの値に集約する方法を解説。COUNT・SUM・AVG・MIN・MAX・GROUP_CONCATの基本から、DISTINCTやFILTER、NULLの扱い方まで実例つきでまとめます。
- GROUP BYとHAVINGSQLiteのGROUP BYで行をグループ化し、HAVINGで集計後の結果を絞り込む方法を解説。WHEREとHAVINGの使い分けも具体例で整理します。
リレーションとJOIN
- 外部キーSQLiteの外部キーの仕組みを解説。REFERENCESの書き方、PRAGMAでの有効化、ON DELETEの選び方までまとめて押さえます。
- INNER JOINSQLiteのINNER JOINをイメージから理解。ON句の書き方、3つ以上のテーブルを結合する方法、USINGショートカットまでまとめて解説します。
- LEFT JOINSQLiteのLEFT JOINで左側のレコードを全部残す書き方を解説。NULLの扱い、WHEREとONの使い分け、複数テーブル結合、INNER JOINとの違いまでサンプル付きで整理します。
- Self JoinSQLiteのself join(自己結合)の仕組みを、エイリアスの使い方と社員・上司テーブルや階層データの実例を交えて解説します。
- サブクエリSQLite で SELECT を入れ子にする書き方を実例で解説。スカラーサブクエリ、IN/EXISTS、派生テーブル、相関サブクエリ、そして JOIN との使い分けまで。
- CTE (WITH句)SQLiteのCTE(共通テーブル式)の使い方を解説。WITH句でサブクエリに名前を付け、複数のCTEを連結して、上から下に読めるクエリを書くコツをまとめました。
- 再帰CTESQLiteの再帰CTEの仕組みを解説。アンカー部と再帰部の構造、親子関係をたどる木構造クエリ、連番生成、無限ループを防ぐコツまでまとめます。
インデックスとパフォーマンス
- インデックスSQLite のインデックスがどう動くのか、効くケースと逆効果になるケース、そしてプランナが本当にインデックスを使っているかの確認方法までまとめて解説します。
- 複合インデックスSQLite の複合インデックス(マルチカラムインデックス)の仕組み、列の順序が重要な理由、そして効くケースと容量を無駄にするだけのケースを解説します。
- 部分インデックスSQLite の部分インデックスを使って、実際にクエリされる行だけをインデックス化する方法を解説。論理削除、条件付きユニーク制約、ホットな部分集合といった、効果が出やすいパターンも紹介します。
- EXPLAIN QUERY PLANSQLiteのEXPLAIN QUERY PLANの読み方を解説。インデックスが効いているか、SCANとSEARCHの違い、JOINの実行計画まで実例で紹介します。
- ANALYZE と VACUUMSQLiteを軽快かつコンパクトに保つための`ANALYZE`と`VACUUM`。それぞれが実際に何をしているのか、いつ実行すべきか、押さえておきたいバリエーションまでまとめて解説します。
高度な機能
- トランザクションSQLiteのトランザクションの基本を解説。BEGIN・COMMIT・ROLLBACKの使い方から、autocommitの挙動、ロックを取るタイミングを決めるDEFERRED/IMMEDIATE/EXCLUSIVEの違いまで一気に整理します。
- SAVEPOINTSQLiteのSAVEPOINTは、トランザクションの途中に名前付きの目印を打てる仕組み。全体を捨てずに、一部だけ巻き戻す書き方を実例で解説します。
- ビューSQLiteのビュー(VIEW)について解説。SELECT文を仮想テーブルとして保存する仕組み、一時ビューの使いどころ、そしてビューが既定で読み取り専用になる理由まで一気に整理します。
- トリガー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、RANK系の使い分け、LAG/LEAD、フレーム指定で累計を出す方法まで一気に押さえます。
- 生成カラムSQLiteの生成カラム(GENERATED ALWAYS AS)の基本から、VIRTUALとSTOREDの違い、インデックスを張って高速化するコツまでをまとめて解説します。
- ATTACH DATABASEATTACH DATABASEを使えば、1つの接続で複数のSQLiteファイルを開いてスキーマ名で横断クエリできます。アタッチからJOIN、DETACHまでの実践的な使い方を解説。
セキュリティとアプリケーション統合
- プリペアドステートメントSQLiteのプリペアドステートメントとは何か、なぜ必要なのか。すべてのドライバが内部で行っている prepare → bind → step → finalize というライフサイクルを丁寧に解説します。
- バインドパラメータSQLite のバインドパラメータを基礎から解説。位置指定の `?`、名前付きの `:name`、NULL の渡し方、そしてアプリ側から値を安全に渡すための実践ルールまで。
- SQLインジェクション対策文字列連結でクエリを組み立てるのはなぜ危険なのか。SQLインジェクションの仕組みと、SQLiteのプレースホルダ(バインド変数)で確実に防ぐ方法を解説します。
- アプリから接続Python、Node.js、Go、JavaなどからSQLiteへ接続する方法を解説。ファイルパスの指定、ドライバの選び方、最初に押さえておきたい設定までまとめました。
- マイグレーションPRAGMA user_versionと番号付きマイグレーションスクリプト、トランザクションを組み合わせて、SQLiteのスキーマを安全に進化させる実践的な手順をまとめました。
- WALと並行処理SQLiteのWAL(ライトアヘッドログ)を有効にすると同時実行性がどう変わるのか。読み取りと書き込みが互いをブロックしなくなる仕組みや、`-wal`・`-shm`ファイルの役割を実践目線でまとめます。
本番運用
- バックアップと復元SQLiteデータベースを安全にバックアップ・復元する方法を解説。.backupコマンド、VACUUM INTO、オンラインバックアップAPIの使い分け、そしてDBファイルを単純コピーしてはいけない理由まで。
- PRAGMA設定本番環境で本当に効くPRAGMAだけを厳選。journal_mode、synchronous、foreign_keys、busy_timeout、cache_sizeに何を指定すべきか実例で解説します。
- よくあるエラーdatabase is locked、readonly database、disk image is malformed、制約エラーなど、SQLiteで実際にハマりやすいエラーの原因と直し方をまとめました。