【初心者向け】SQLite入門:特徴と簡単な使い方を解説
はじめに
「データベース」と聞いて、難しそう、専門知識が必要そう、と感じる方は多いかもしれません。しかし、ITの世界だけでなく、私たちの日常生活でもデータは溢れており、それを効率的に管理することは非常に重要です。ExcelやCSVファイルでデータを管理している方も多いと思いますが、データの量が増えたり、複数の人で共有したり、複雑な条件で検索したりするようになると、ファイル管理では限界が出てきます。
そこで登場するのが「データベース」です。データベースは、構造化されたデータを効率的に格納、管理、検索するための仕組みです。そして、データベースには様々な種類がありますが、中でも初心者の方が「データベースとは何か」「SQLとは何か」を学ぶのに最適なのが SQLite です。
この記事では、データベースの基礎から始め、SQLiteがどのようなもので、どんな特徴を持ち、どのように使うのかを、初心者の方にも分かりやすく徹底的に解説します。この記事を読めば、あなたは以下のことができるようになります。
- データベースの基本的な考え方を理解できる
- SQLiteのユニークな特徴とメリット・デメリットを知れる
- SQLiteの導入方法を知れる
- SQLiteのコマンドラインツールを使って操作できるようになる
- データベースを操作するための言語であるSQLの基本的な書き方を学べる
- 実際に簡単なデータベースを作成し、データの登録、取得、更新、削除ができるようになる
さあ、データベースの世界への第一歩を、SQLiteと一緒に踏み出しましょう!
第1章:データベースとは何か?なぜ必要なのか?
データベース(Database, DB)とは、構造化されたデータの集まりであり、コンピュータ上で効率的に管理、検索、更新できるように整理されたものです。単にデータを保存するだけでなく、データの整合性を保ち、複数のユーザーが同時にアクセスできるようにする機能なども持っています。
1.1 ファイル管理との比較
なぜ、単にファイルを保存するだけでは不十分で、データベースが必要なのでしょうか?一般的なファイル(Excelファイルやテキストファイルなど)でデータを管理する場合と比較してみましょう。
機能 | ファイル管理(例: Excel) | データベースシステム |
---|---|---|
データの構造 | 比較的自由(表形式が多いが厳密さに欠ける) | 厳密に定義された構造(テーブル、列、データ型) |
データの整合性 | 手動でのチェックが必要、入力ミスが発生しやすい | 制約(NOT NULL, UNIQUEなど)により自動で整合性を維持 |
検索・抽出 | 関数やフィルタ機能、VBAなど、複雑な条件は困難 | SQLという専用言語で柔軟かつ高速に検索可能 |
データ量 | 大量データになると処理が遅くなる、扱いにくい | 大量データでも効率的に扱えるように設計されている |
複数アクセス | 同時編集が難しい、排他制御が複雑になる | 複数のユーザーが同時に安全にアクセス可能(排他制御) |
セキュリティ | ファイル単位のアクセス権限設定が基本 | ユーザー認証、アクセス権限設定など、より詳細な制御 |
データの関連性 | 表現が難しい(VLOOKUPなどで対応) | リレーションシップで明確に定義、管理できる |
堅牢性・復旧 | アプリケーションやOSのクラッシュで破損リスク | トランザクション処理により高い堅牢性、復旧機能 |
このように、データベースシステムを利用することで、データの管理をより効率的、安全、かつ柔軟に行うことができます。特に、データの量が増えたり、複数の人がデータを扱ったり、データ間の関連性が重要になるケースでは、データベースの導入が不可欠になります。
1.2 リレーショナルデータベース(RDB)とは?
データベースにはいくつかの種類がありますが、現在最も広く使われているのがリレーショナルデータベース(RDB)です。SQLiteもこのRDBに分類されます。
RDBでは、データをテーブルという形式で管理します。テーブルは、Excelのシートのようなものだと考えてください。
- テーブル (Table): 特定の種類の情報を格納する場所(例:「顧客リスト」テーブル、「商品一覧」テーブル)。
- 行 (Row / Record / Tuple): テーブルの中の1つのまとまり。1件のデータに相当します(例:顧客リストの「田中太郎」さんの情報)。
- 列 (Column / Field / Attribute): テーブルの中の各項目。データの種類を表します(例:顧客リストの「氏名」「年齢」「住所」といった項目)。
さらに、RDBではテーブル間の関連性(リレーションシップ)を定義できるのが大きな特徴です。例えば、「顧客」テーブルと「注文」テーブルがある場合、どの顧客がどの注文をしたか、といった関連性を設定できます。この関連性を設定するために使われるのが、「主キー (Primary Key)」と「外部キー (Foreign Key)」です。
- 主キー (Primary Key): テーブル内の各行を一意に識別するための列、または列の組み合わせ。例えば「顧客ID」など。主キーはNULLであってはならず、重複も許されません。
- 外部キー (Foreign Key): 別のテーブルの主キーを参照する列。これにより、テーブル間の関連性を定義します。例えば、「注文」テーブルの「顧客ID」列は、「顧客」テーブルの「顧客ID」を外部キーとして参照します。
1.3 SQL(Structured Query Language)とは?
RDBに格納されたデータを操作するためには、専用の言語が必要です。それが SQL(Structured Query Language:構造化照会言語) です。
SQLは、データベースの作成、テーブルの定義、データの検索、追加、更新、削除といった操作を行うための標準的な言語です。ほとんど全てのリレーショナルデータベースシステムで利用されており、データベースを扱う上では必須のスキルとなります。
SQL文は、いくつかの命令(キーワード)を組み合わせて記述します。主な命令には以下のようなものがあります。
SELECT
: データを検索・取得するINSERT
: 新しいデータを追加するUPDATE
: 既存のデータを更新するDELETE
: データを削除するCREATE TABLE
: 新しいテーブルを作成するDROP TABLE
: テーブルを削除するALTER TABLE
: テーブルの定義を変更する
これらの命令を使いこなすことで、データベース内のデータを自由自在に操作できるようになります。SQLiteもSQLを使って操作します。
第2章:SQLiteとは?その特徴とメリット・デメリット
それでは、本題のSQLiteについて詳しく見ていきましょう。
2.1 SQLiteの定義
SQLiteは、パブリックドメインで提供される、軽量なリレーショナルデータベース管理システム(RDBMS)です。RDBMSとしての機能を持ちながら、一般的なデータベースシステムとは異なる非常にユニークな特徴を持っています。
最大の特徴は、「サーバー不要」であることです。多くのデータベースシステム(MySQL, PostgreSQL, SQL Server, Oracleなど)は、クライアント・サーバーモデルで動作します。つまり、データベース本体を動かすためのサーバープロセスが常に稼働しており、利用者はクライアントアプリケーションを通じてそのサーバーに接続してデータベースを操作します。
しかし、SQLiteは違います。SQLiteはデータベースシステム全体がライブラリとして提供され、アプリケーションに組み込まれて動作します。データベース本体は、たった1つのファイルとしてコンピュータのローカルストレージに保存されます。まるで普通のファイルを開いて編集するような感覚でデータベースを扱えるのです。このため、SQLiteは「組み込み型データベース」や「サーバレスデータベース」と呼ばれます。
2.2 SQLiteの主要な特徴
SQLiteのこの「サーバレス」という設計から、様々な特徴が生まれます。
-
サーバー不要(サーバレス):
- 前述の通り、独立したデータベースサーバープロセスは不要です。データベース機能はアプリケーションのプロセス内で実行されます。
- これにより、導入や運用が非常にシンプルになります。
-
設定不要(ゼロコンフィギュレーション):
- インストールや複雑な設定ファイル編集は基本的に不要です。
- データベースを作成するには、SQLiteライブラリ(またはコマンドラインツール)にデータベースファイルの名前を指定するだけでOKです。ファイルが存在しなければ新規作成されます。
-
トランザクショナル(ACID準拠):
- サーバレスで軽量でありながら、データベース操作の信頼性を保証する重要な仕組みであるトランザクションを完全にサポートしています。
- トランザクションとは、複数のデータベース操作を一連のまとまり(処理単位)として扱い、「全て成功するか、または全て失敗して元に戻すか」を保証する仕組みです。
- SQLiteは以下のACID特性に準拠しています。
- Atomicity (原子性): トランザクションは不可分な一単位として扱われます。全て実行されるか、全く何も実行されないかのどちらかです。
- Consistency (一貫性): トランザクションによってデータベースの整合性が損なわれることはありません。
- Isolation (独立性): 複数のトランザクションが同時に実行されても、それぞれのトランザクションは他のトランザクションの影響を受けずに実行されているように見えます。
- Durability (永続性): コミットされたトランザクションの結果は、システムの障害(電源断など)が発生しても失われることはありません。
- これにより、たとえ処理中にアプリケーションやシステムがクラッシュしても、データベースファイルの内容が壊れたり、中途半端な状態になったりするリスクを最小限に抑えられます。
-
単一ファイル:
- データベース全体が、基本的に拡張子
.db
や.sqlite
、.sqlite3
などを持つ1つのファイルに格納されます。(ただし、一時ファイルやWALモード使用時は関連ファイルが生成されます。) - バックアップが容易(ファイルをコピーするだけ)
- データベースの移動や配布が簡単(ファイルを移動するだけ)
- データベース全体が、基本的に拡張子
-
パブリックドメイン:
- SQLiteのソースコードはパブリックドメインとして公開されており、商用・非商用を問わず、無償で自由に利用、配布、改変が可能です。ライセンスに関する心配がありません。
-
軽量・高速:
- コードベースがコンパクトで、システムリソースの消費が少ないです。
- 特に読み込み(SELECT)の性能は非常に高いです。書き込み(INSERT, UPDATE, DELETE)は単一プロセスからのアクセスであれば高速ですが、並行書き込みには限界があります(後述)。
-
クロスプラットフォーム:
- 主要なOS(Windows, macOS, Linux, iOS, Androidなど)や様々なプログラミング言語(Python, Java, PHP, Ruby, C#, C++, JavaScript (Node.js) など)に対応しています。
2.3 SQLiteのメリット
これらの特徴から、SQLiteには多くのメリットがあります。
- 導入・管理が極めて容易: データベースサーバーのインストール、設定、起動、停止、チューニング、ユーザー管理などの手間が一切不要です。アプリケーションにライブラリとして組み込むだけで使えます。
- 開発コストの削減: サーバーインフラが不要なため、データベースサーバーの準備や管理にかかる時間と費用を節約できます。
- 移植性が高い: データベースファイル一つをコピーするだけで、異なる環境へ簡単に移動できます。
- 組み込み用途に最適: モバイルアプリ、デスクトップアプリ、家電製品、組み込み機器など、独立したデータベースサーバーを立てるのが難しい環境や、リソースに制限がある環境に最適です。FirefoxやChromeといったWebブラウザも内部データ(ブックマーク、履歴など)の管理にSQLiteを利用しています。
- 学習コストが低い: 構造がシンプルで、コマンドラインツールも使いやすいです。データベースやSQLの基本的な概念を学ぶのに非常に適しています。
2.4 SQLiteのデメリット
一方で、SQLiteにもいくつかのデメリットや注意点があります。
- 大規模・高負荷なWebサービスには不向き:
- 特に並行書き込み性能に限界があります。SQLiteはデータベースファイル全体をロックして書き込みを行うため、複数のプロセスやスレッドから同時に書き込み要求があると、待ち時間が発生し、性能が劣化したりタイムアウトしたりする可能性があります。多くのユーザーが同時にデータを書き換えるようなWebアプリケーションのバックエンドには、MySQLやPostgreSQLのようなサーバー型データベースの方が適しています。ただし、読み込み中心のアクセスであれば問題ない場合が多いです。
- 近年、この問題を緩和するためのWAL(Write-Ahead Logging)モードが導入されましたが、それでもサーバー型データベースほどの並行書き込み性能は期待できません。
- ユーザー管理・権限管理機能がない: サーバレスの設計上、データベース自体にユーザーを作成したり、各ユーザーのテーブルへのアクセス権限を設定したりする機能はありません。アクセス制御は、データベースファイルが保存されているOSレベルのファイル権限や、データベースを利用するアプリケーション側で行う必要があります。
- 機能制限:
- 他の主要なRDBMSに比べて、サポートしているSQLの機能やデータ型に一部制限があります。例えば、一部の複雑なJOIN句(RIGHT JOIN, FULL OUTER JOIN)や高度なウィンドウ関数など、サポートされていない機能があります。(ただし、多くの基本的な操作は可能です。)
- データ型についても、他のRDBMSとは異なる独自の型アフィニティ(Affinity Type)という仕組みを持っています(後述)。
- デバッグが難しい場合がある: アプリケーションに組み込まれて動作するため、データベース内部の挙動を詳細に監視したり、デバッグしたりすることが、サーバー型のデータベースに比べて難しい場合があります。
2.5 SQLiteが適しているケース
以上のメリット・デメリットを踏まえると、SQLiteは以下のようなケースに非常に適しています。
- デスクトップアプリケーション: アプリケーションの設定情報、ローカルデータなどを保存する。
- モバイルアプリケーション: iOSやAndroidアプリのローカルストレージとして標準的に採用されている。
- 組み込みシステム: リソースが限られたデバイスのデータ管理。
- 開発・テスト用途: 開発中のプロトタイプや、小規模なアプリケーションのデータストアとして手軽に利用。テストデータの管理など。
- 小規模なWebサイト/個人ブログ: アクセスが集中せず、書き込み頻度もそれほど高くない場合。
- 学習用途: データベースやSQLの基本的な操作を学ぶための最初のステップとして。
逆に、大量の同時アクセスが発生する大規模Webサービスのバックエンドや、高度なセキュリティ機能が必須となるエンタープライズシステムなどには、より堅牢で高機能なサーバー型データベースを検討すべきでしょう。
第3章:SQLiteを始めよう!環境構築
SQLiteを始めるのに、特別な環境構築はほとんど必要ありません。多くのOSには標準で搭載されているか、あるいは非常に簡単にインストールできます。
3.1 環境構築の基本的な考え方
SQLiteは「サーバレス」なので、データベースサーバーのインストールは不要です。必要なのは、SQLiteのライブラリ自体か、SQLiteのコマンドラインツールだけです。この記事では、まずコマンドラインツールを使った操作方法を中心に解説します。
SQLiteのコマンドラインツール(sqlite3
コマンド)は、SQLiteライブラリを使ったシンプルなターミナルアプリケーションです。これを使うことで、直接SQL文を実行したり、データベースファイルを操作したりできます。
3.2 Windowsでの導入方法
Windowsの場合、標準ではsqlite3
コマンドは含まれていません。公式サイトからダウンロードする必要があります。
-
SQLite公式サイトにアクセス:
https://www.sqlite.org/download.html -
「Precompiled Binaries for Windows」セクションを探す:
いくつかのバージョンがありますが、通常は最新版の「sqlite-tools-win64-x64-xxxxxxx.zip」(64ビット版の場合)または「sqlite-tools-win32-x86-xxxxxxx.zip」(32ビット版の場合)をダウンロードします。ご自身のOS環境に合わせて選択してください。 -
ダウンロードしたZIPファイルを展開:
適当な場所にZIPファイルを展開します。例えばC:\sqlite
のようなフォルダを作成して展開すると良いでしょう。展開すると、sqlite3.exe
,sqldiff.exe
,sqlite3_analyzer.exe
といったファイルが含まれています。 -
コマンドプロンプトまたはPowerShellから実行:
- 方法A: パスを通す(推奨)
展開したフォルダ(例:C:\sqlite
)のパスをシステムの環境変数Path
に追加します。これにより、どのディレクトリからでもsqlite3
コマンドを実行できるようになります。環境変数の設定方法はWindowsのバージョンによって異なりますが、「システムのプロパティ」->「詳細設定」->「環境変数」から設定できます。設定後、新しいコマンドプロンプトを開き直してください。 - 方法B: 展開したフォルダに移動して実行
環境変数を設定しない場合は、コマンドプロンプトまたはPowerShellを開き、cd
コマンドでsqlite3.exe
があるフォルダに移動してからsqlite3
コマンドを実行します。
- 方法A: パスを通す(推奨)
-
動作確認:
コマンドプロンプトやPowerShellでsqlite3
と入力してEnterキーを押します。以下のような表示が出れば成功です。SQLite version 3.xx.xx xxxxxxx
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
sqlite>
というプロンプトが表示されれば、SQLiteのコマンドラインツールが起動しています。終了するには.quit
または.exit
と入力します。
3.3 macOSでの導入方法
macOSの場合、macOS Sierra (10.12) 以降ではSQLiteが標準搭載されています。特別なインストールは不要な場合が多いです。
- ターミナルを開く: アプリケーション -> ユーティリティ -> ターミナル を開きます。
-
動作確認:
sqlite3
と入力してEnterキーを押します。SQLite version 3.xx.xx xxxxxxx
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
このように表示されれば、すでに利用可能です。
もし古いバージョンを使いたい場合や、標準搭載されていない非常に稀なケースでは、Homebrewなどのパッケージマネージャーを使ってインストールすることも可能です。
bash
brew install sqlite
3.4 Linuxでの導入方法
ほとんどのLinuxディストリビューションにはSQLiteが標準搭載されているか、パッケージマネージャーを使って簡単にインストールできます。
- ターミナルを開く:
- 動作確認:
sqlite3
と入力してEnterキーを押します。標準搭載されていれば起動します。 - インストールが必要な場合: 各ディストリビューションのパッケージマネージャーを使います。
- Debian/Ubuntu系:
sudo apt update && sudo apt install sqlite3
- Fedora/CentOS/RHEL系:
sudo dnf install sqlite
またはsudo yum install sqlite
- Debian/Ubuntu系:
インストール後、再度 sqlite3
コマンドを実行して起動することを確認してください。
第4章:SQLiteコマンドラインツールを使ってみよう
環境構築ができたら、実際にsqlite3
コマンドラインツールを使ってSQLiteデータベースを操作してみましょう。
4.1 sqlite3
コマンドの起動
ターミナル(コマンドプロンプト、PowerShell)を開き、sqlite3
と入力してEnterキーを押すと起動します。
bash
sqlite3
起動すると sqlite>
というプロンプトが表示されます。ここにSQLite独自の「ドットコマンド」やSQL文を入力して実行します。
4.2 データベースファイルを開く/作成する
sqlite3
コマンドを実行しただけでは、まだ永続的なデータベースファイルは作成されていません。「一時的なインメモリデータベースに接続されています」というメッセージが出ているはずです。
永続的なデータベースファイルを作成または開くには、sqlite3
コマンドの引数にファイル名を指定するか、起動後に .open
コマンドを使います。
起動時にファイル名を指定する方法:
bash
sqlite3 mydatabase.db
このコマンドを実行すると、以下のようになります。
* mydatabase.db
というファイルが存在しない場合: 新規に作成され、そのデータベースに接続されます。
* mydatabase.db
というファイルが存在する場合: そのファイルを開いて、既存のデータベースに接続されます。
起動後に .open
コマンドを使う方法:
まず sqlite3
でツールを起動し、sqlite>
プロンプトが表示されたら以下のコマンドを入力します。
sqlite
sqlite> .open mydatabase.db
これも上記と同様に、ファイルが存在しなければ作成、存在すれば開きます。
どちらの方法でも、データベースファイルに接続されると、以降の操作はそのファイルに対して行われます。
4.3 SQLite独自のドットコマンド
sqlite>
プロンプトでは、SQL文だけでなく、.
(ドット) から始まる特別なコマンド(ドットコマンド)が使えます。これらはデータベースの操作というよりは、ツール自体の設定変更や情報の表示に使われます。主なドットコマンドを紹介します。
.help
: 利用可能なドットコマンドの一覧を表示します。困ったらまずこれを実行しましょう。.databases
: 現在接続しているデータベースファイルの情報(エイリアスとファイルパス)を表示します。
sqlite
sqlite> .databases
main: /path/to/your/mydatabase.db.tables
: 現在のデータベースにあるテーブルの一覧を表示します。.schema [テーブル名]
: 指定したテーブルのCREATE TABLE
文を表示します。テーブル名を省略すると、すべてのテーブルのスキーマを表示します。テーブルの構造を確認するのに非常に便利です。.quit
または.exit
:sqlite3
コマンドラインツールを終了します。データベースファイルへの変更は自動的に保存されます。.mode モード名
:SELECT
文の結果の表示形式を変更します。.mode list
(デフォルト): 値をパイプ|
で区切って表示します。.mode column
: 列を揃えて表示します。最も見やすい形式でおすすめです。.mode html
: HTMLのテーブル形式で表示します。.mode csv
: CSV形式で表示します。
.headers on/off
:SELECT
文の結果に列名(ヘッダー)を表示するかどうかを切り替えます。.separator 文字列
:.mode list
や.mode csv
で使用される区切り文字を変更します。
これらのドットコマンドは非常に便利なので、ぜひ使い慣れてください。特に .mode column
と .headers on
を設定しておくと、SQLの実行結果が見やすくなります。
4.4 SQL文の実行方法
sqlite>
プロンプトにSQL文を入力し、最後にセミコロン ;
を付けてEnterキーを押すと実行されます。
sqlite
sqlite> SELECT 1 + 1;
2
SQL文は複数行に渡っても構いません。セミコロンが現れるまで1つのSQL文とみなされます。
sqlite
sqlite> SELECT
...> 'Hello, ' || 'World!';
Hello, World!
...>
は、前の行がセミコロンで終わっていないため、まだSQL文が継続中であることを示しています。
エラーが発生した場合は、エラーメッセージが表示されます。
第5章:SQLの基本を学ぼう(SQLite方言)
ここでは、SQLiteを使ってデータベースやテーブルを作成・操作するための基本的なSQL文を学びます。SQLは標準化されていますが、RDBMSごとに少しずつ異なる「方言」があります。SQLiteにもいくつかの独自仕様や制限があるため、それらも含めて解説します。
5.1 SQLの基本的な構成要素
SQL文は、キーワード、識別子、定数、演算子などを組み合わせて構成されます。
- キーワード:
SELECT
,FROM
,WHERE
,CREATE TABLE
など、SQLによって予約された単語。大文字・小文字は区別されませんが、慣習的に大文字で書かれることが多いです。 - 識別子: データベース名、テーブル名、列名など、ユーザーが定義する名前。
- 定数: 数値 (
123
,3.14
)、文字列 ('文字列'
)、NULLなど。文字列はシングルクォート'
で囲みます。 - 演算子: 四則演算 (
+
,-
,*
,/
)、比較演算子 (=
,!=
,>
,<
,>=
,<=
)、論理演算子 (AND
,OR
,NOT
) など。
コメントは --
(行末まで)または /* ... */
(複数行)で記述できます。
“`sql
— これは一行コメントです
/
これは
複数行
コメントです
/
“`
5.2 データベース操作
SQLiteではデータベースはファイルそのものなので、CREATE DATABASE
のようなSQL文は使いません。sqlite3
コマンドの引数や .open
コマンドでファイルを開くことがデータベースへの接続・作成に相当します。
関連する操作として、複数のデータベースファイルを同時に扱うための .attach
コマンドと .detach
コマンドがあります(これらはドットコマンドであり、SQL文ではありませんが、概念として触れておきます)。
sqlite
sqlite> .attach another.db AS another_db; -- another.db を 'another_db' という別名でアタッチ
sqlite> SELECT * FROM main.users; -- 現在接続しているデータベースのusersテーブル
sqlite> SELECT * FROM another_db.products; -- アタッチしたデータベースのproductsテーブル
sqlite> .detach another_db; -- アタッチを解除
5.3 テーブル操作
データベース内にデータを格納するためには、まずテーブルを作成する必要があります。
5.3.1 テーブルの作成 (CREATE TABLE
)
テーブルを作成するには CREATE TABLE
文を使います。
sql
CREATE TABLE テーブル名 (
列名1 データ型1 制約1,
列名2 データ型2 制約2,
...
テーブルレベル制約
);
- データ型: SQLiteは他のRDBMSと異なり、宣言されたデータ型を厳密に強制しません(動的型付け)。代わりに、指定された型名に基づいて「型アフィニティ(Affinity Type)」を決定し、データの格納に適した内部的なデータ型(INTEGER, REAL, TEXT, BLOB, NULL)を選びます。主な型アフィニティとそれに含まれる型名は以下の通りです。
INTEGER
:INT
,INTEGER
,TINYINT
,SMALLINT
,MEDIUMINT
,BIGINT
,UNSIGNED BIG INT
,INT2
,INT8
,BOOLEAN
,DATE
,DATETIME
など。符号付き整数として格納されます。BOOLEAN
や日付型もINTEGERとして扱われます。REAL
:REAL
,DOUBLE
,DOUBLE PRECISION
,FLOAT
など。浮動小数点数として格納されます。TEXT
:TEXT
,CHARACTER
,VARCHAR
,VARYING CHARACTER
,NCHAR
,NATIVE CHARACTER
,NVARCHAR
,CLOB
など。文字列として格納されます。BLOB
:BLOB
。バイナリデータとして格納されます。NUMERIC
:NUMERIC
,DECIMAL
,BOOLEAN
,DATE
,DATETIME
,TIMESTAMP
など。入力値の形式によってINTEGER, REAL, TEXTのいずれかとして格納されます。
- 制約 (Column Constraints): 各列に対して設定できる制約。
PRIMARY KEY
: その列を主キーとします。INTEGER PRIMARY KEY
とすると、通常その列は一意な整数が自動的に割り当てられるROWID
のエイリアスとなり、重複しない値が自動生成されます(AUTOINCREMENT
はオプションで、重複しない値が単調増加することを保証しますが、ほとんどの場合はAUTOINCREMENT
なしで十分です)。NOT NULL
: その列にNULL値を格納することを許可しません。UNIQUE
: その列の値がテーブル全体で一意であることを保証します。DEFAULT デフォルト値
: 値が指定されなかった場合に自動的に設定される値を指定します。CHECK 条件式
: その列に挿入または更新される値が、指定した条件式を満たすことを強制します。COLLATE 照合順序
: 文字列の比較やソートに使用する照合順序を指定します。
- 制約 (Table Constraints): テーブル全体に対して設定できる制約。
PRIMARY KEY (列名1, 列名2, ...)
: 複数の列を組み合わせた複合主キーを定義します。UNIQUE (列名1, 列名2, ...)
: 複数の列の組み合わせが一意であることを保証します。FOREIGN KEY (列名) REFERENCES 参照元テーブル(参照元列)
: 外部キー制約を定義します。デフォルトでは外部キー制約は無効になっているため、有効にするにはPRAGMA foreign_keys = ON;
を実行する必要があります。
例: ユーザー情報を格納する users
テーブルを作成する
sql
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- 主キー、自動採番
name TEXT NOT NULL, -- 名前、必須項目
age INTEGER CHECK (age >= 0), -- 年齢、0以上であること
email TEXT UNIQUE -- メールアドレス、重複不可
);
5.3.2 テーブルの削除 (DROP TABLE
)
テーブルを完全に削除するには DROP TABLE
文を使います。テーブル内のデータもすべて失われます。
sql
DROP TABLE テーブル名;
例: users
テーブルを削除する
sql
DROP TABLE users;
5.3.3 テーブル定義の変更 (ALTER TABLE
)
既存のテーブルの定義を変更するには ALTER TABLE
文を使います。ただし、SQLiteの ALTER TABLE
は他のRDBMSに比べて機能が制限されています。
主な操作:
* カラムの追加: ALTER TABLE テーブル名 ADD COLUMN 列名 データ型 制約;
* カラム名の変更: ALTER TABLE テーブル名 RENAME COLUMN 旧列名 TO 新列名;
(SQLite 3.25.0以降)
* テーブル名の変更: ALTER TABLE 旧テーブル名 RENAME TO 新テーブル名;
制限:
* 既存カラムのデータ型や制約(PRIMARY KEY, NOT NULL, UNIQUEなど)を直接変更することはできません。
* カラムの削除も直接はできません。
これらの制限があるため、複雑なテーブル定義変更を行う場合は、新しい定義でテーブルを作成し、データをコピーして、古いテーブルを削除するという手順が必要になる場合があります。
例: users
テーブルに address
カラムを追加する
sql
ALTER TABLE users ADD COLUMN address TEXT;
5.4 データ操作(CRUD)
データベース操作の最も基本的な部分が、データの作成 (Create)、読み取り (Read)、更新 (Update)、削除 (Delete) です。これらをまとめて CRUD と呼びます。
5.4.1 データの挿入 (INSERT
)
新しいデータをテーブルに追加するには INSERT
文を使います。
“`sql
— 全ての列に値を指定する場合 (列名を省略可能だが推奨しない)
INSERT INTO テーブル名 VALUES (値1, 値2, …);
— 特定の列に値を指定する場合 (列の順序は指定した列名に合わせる)
INSERT INTO テーブル名 (列名1, 列名2, …) VALUES (値1, 値2, …);
— 複数行を一度に挿入する場合 (SQLite 3.7.11以降)
INSERT INTO テーブル名 (列名1, 列名2, …) VALUES (値1a, 値2a, …), (値1b, 値2b, …), …;
“`
例: users
テーブルにデータを挿入する
“`sql
— 1件挿入 (idは自動採番されるので指定しない)
INSERT INTO users (name, age, email) VALUES (‘山田太郎’, 30, ‘[email protected]’);
— 別の1件挿入
INSERT INTO users (name, age) VALUES (‘佐藤花子’, 25); — emailはNULLが許容されるかDEFAULT値が入る
— 複数件挿入
INSERT INTO users (name, age, email) VALUES
(‘田中一郎’, 40, ‘[email protected]’),
(‘鈴木恵子’, 35, ‘[email protected]’);
“`
5.4.2 データの取得 (SELECT
)
テーブルからデータを検索・取得するには SELECT
文を使います。これがSQLの中で最も頻繁に利用される文です。
基本的な構文:
sql
SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 条件式
ORDER BY 列名 [ASC|DESC]
LIMIT 件数 OFFSET オフセット;
各句は省略可能です。
SELECT 列名1, 列名2, ...
: 取得したい列を指定します。全ての列を取得する場合は*
を指定します。列名の代わりに式や関数を指定することもできます。FROM テーブル名
: データを取得するテーブルを指定します。複数のテーブルを結合する場合は,
で区切るかJOIN
句を使います。WHERE 条件式
: 取得する行を絞り込む条件を指定します。条件を満たす行だけが結果に含まれます。- 比較演算子:
=
,!=
(または<>
),>
,<
,>=
,<=
- 論理演算子:
AND
,OR
,NOT
- パターンマッチ:
LIKE
(‘%’ 任意の文字列, ‘_’ 任意の一文字)
sql
WHERE name LIKE '山田%'; -- 「山田」で始まる名前
WHERE email LIKE '%@example.com'; -- 「@example.com」で終わるメールアドレス
WHERE name LIKE '_田%'; -- 2文字目が「田」の名前 - 範囲指定:
BETWEEN 最小値 AND 最大値
sql
WHERE age BETWEEN 20 AND 30; -- 20歳以上30歳以下のage - リストに含まれるか:
IN (値1, 値2, ...)
sql
WHERE age IN (25, 30, 40); -- ageが25, 30, 40のいずれか - NULLの判定:
IS NULL
,IS NOT NULL
(= NULL
や!= NULL
は使用できません)
sql
WHERE email IS NULL; -- emailがNULLの行
- 比較演算子:
ORDER BY 列名 [ASC|DESC]
: 結果を特定の列でソート(並べ替え)します。ASC
は昇順(デフォルト)、DESC
は降順です。複数の列を指定できます(カンマ区切り)。LIMIT 件数
: 取得する最大件数を指定します。OFFSET オフセット
: 取得を開始する行のオフセットを指定します(最初の行はオフセット0)。LIMIT
と組み合わせてページネーションに利用されます。
例: users
テーブルからデータを取得する
“`sql
— 全ての列と全ての行を取得
SELECT * FROM users;
— nameとageの列だけ取得
SELECT name, age FROM users;
— ageが30以上のユーザーを取得
SELECT * FROM users WHERE age >= 30;
— 名前に「田」が含まれるユーザーを取得
SELECT * FROM users WHERE name LIKE ‘%田%’;
— ageで昇順にソートして取得
SELECT * FROM users ORDER BY age ASC;
— ageで降順にソートし、最初の2件を取得
SELECT * FROM users ORDER BY age DESC LIMIT 2;
— ageで昇順ソートし、3件目から2件を取得 (3, 4番目の行)
SELECT * FROM users ORDER BY age ASC LIMIT 2 OFFSET 2;
“`
集計関数 (COUNT
, SUM
, AVG
, MIN
, MAX
)
特定の列の値に対して計算を行い、単一の結果を得る関数です。
COUNT(列名または*)
: 条件に一致する行数またはNULL以外の値の数をカウントします。COUNT(*)
は行数をカウントします。SUM(列名)
: 数値列の値の合計を計算します。AVG(列名)
: 数値列の値の平均を計算します。MIN(列名)
: 列の最小値を取得します。MAX(列名)
: 列の最大値を取得します。
“`sql
— 全ユーザーの数をカウント
SELECT COUNT(*) FROM users;
— ageの平均値を計算
SELECT AVG(age) FROM users;
— ageの最小値と最大値を取得
SELECT MIN(age), MAX(age) FROM users;
“`
グループ化 (GROUP BY
と HAVING
)
データを特定の列の値でグループ化し、グループごとに集計関数を適用したい場合に GROUP BY
句を使います。
sql
SELECT グループ化に使う列名, 集計関数(...)
FROM テーブル名
WHERE 行の絞り込み条件
GROUP BY グループ化に使う列名
HAVING グループの絞り込み条件
ORDER BY ...;
GROUP BY 列名
: 指定した列の値が同じ行を1つのグループとみなします。SELECT
句で集計関数以外の列を指定する場合、通常はその列がGROUP BY
句に含まれている必要があります(SQLiteでは少し緩いですが、他のRDBMSでは必須です)。HAVING 条件式
:GROUP BY
によって作成されたグループに対して、集計結果に基づいた条件でグループを絞り込みます。WHERE
句はグループ化 前 の個々の行に対して条件を適用するのに対し、HAVING
句はグループ化 後 のグループ全体に対して条件を適用します。
例: 年齢別にユーザー数をカウントする
sql
SELECT age, COUNT(*) FROM users GROUP BY age;
例: ユーザー数が2人以上の年齢グループだけを表示する
sql
SELECT age, COUNT(*) FROM users GROUP BY age HAVING COUNT(*) >= 2;
結合 (JOIN
)
複数のテーブルを関連付けてデータを取得する場合に JOIN
句を使います。
基本的な構文:
sql
SELECT ...
FROM テーブルA
JOIN テーブルB ON 結合条件;
JOIN
は通常INNER JOIN
と同じ意味です。両方のテーブルに一致する行だけを結合します。LEFT JOIN
(またはLEFT OUTER JOIN
):FROM
句で指定した左側のテーブルの全ての行を含め、右側のテーブルには一致する行がない場合はNULLを埋めて結合します。- SQLiteは標準で
RIGHT JOIN
やFULL OUTER JOIN
を直接サポートしていません。これらが必要な場合は、LEFT JOIN
とUNION ALL
を組み合わせて実現することが多いです。
例: ユーザーテーブルと注文テーブルがあり、ユーザーとその注文履歴を結合して取得する場合(ここでは注文テーブルは存在しないので概念的な説明)
“`sql
— usersテーブルとordersテーブルをuser_idで結合
SELECT
u.name, — usersテーブルのname
o.order_date — ordersテーブルのorder_date
FROM users AS u — usersテーブルにuという別名をつける
JOIN orders AS o ON u.id = o.user_id; — ordersテーブルにoという別名をつける
— LEFT JOIN の例:注文がないユーザーも表示したい場合
SELECT
u.name,
o.order_date
FROM users AS u
LEFT JOIN orders AS o ON u.id = o.user_id;
“`
別名(エイリアス)を使うと、同じ列名がある場合でも区別でき、SQL文が短く書けるので便利です。
5.4.3 データの更新 (UPDATE
)
既存のデータを更新するには UPDATE
文を使います。
sql
UPDATE テーブル名
SET 列名1 = 新しい値1, 列名2 = 新しい値2, ...
WHERE 条件式;
SET
: 更新する列と新しい値を指定します。複数の列を更新する場合はカンマで区切ります。WHERE
: 更新する行を絞り込む条件を指定します。WHERE
句を省略すると、テーブル内の全ての行が更新されてしまうため、非常に注意が必要です。
例: idが1のユーザーの年齢を31に更新する
sql
UPDATE users SET age = 31 WHERE id = 1;
例: ageが30以上のユーザーのageを+1する
sql
UPDATE users SET age = age + 1 WHERE age >= 30;
5.4.4 データの削除 (DELETE
)
テーブルからデータを削除するには DELETE
文を使います。
sql
DELETE FROM テーブル名
WHERE 条件式;
WHERE
: 削除する行を絞り込む条件を指定します。WHERE
句を省略すると、テーブル内の全ての行が削除されてしまうため、非常に注意が必要です。
例: idが1のユーザーを削除する
sql
DELETE FROM users WHERE id = 1;
例: ageが25以下のユーザーを削除する
sql
DELETE FROM users WHERE age <= 25;
5.5 トランザクションについて
前述の通り、SQLiteはトランザクションをサポートしており、デフォルトでは「オートコミットモード」で動作します。これは、INSERT
, UPDATE
, DELETE
などの各SQL文が実行されるたびに、自動的にコミット(変更を永続化)されるということです。
しかし、複数のSQL文を1つの処理単位として扱いたい場合があります。例えば、銀行の送金処理のように、「Aの口座から引き出し」と「Bの口座に入金」という2つの操作は、両方成功するか、両方失敗して元に戻るかのどちらかでなければなりません。片方だけ成功するとデータの不整合が発生します。このような場合にトランザクションを明示的に制御します。
BEGIN TRANSACTION;
またはBEGIN;
: トランザクションを開始します。これ以降に実行されるSQL文は、一時的にメモリ上などに保持され、まだデータベースファイルには完全に書き込まれません。COMMIT;
: 現在のトランザクションでの全ての変更をデータベースファイルに永続的に書き込みます。ROLLBACK;
: 現在のトランザクションでの全ての変更を取り消し、BEGIN
を実行した時点の状態に戻します。
例: トランザクションを使った操作
“`sqlite
sqlite> BEGIN; — トランザクション開始
sqlite> INSERT INTO users (name, age) VALUES (‘テストユーザー1’, 99);
sqlite> INSERT INTO users (name, age) VALUES (‘テストユーザー2’, 98);
sqlite> SELECT * FROM users; — この時点では、挿入されたデータが見えるかもしれないが、まだファイルには完全に保存されていない
sqlite> ROLLBACK; — 変更を取り消す
sqlite> SELECT * FROM users; — テストユーザーは削除されている (ROLLBACKされたため)
sqlite> BEGIN; — 再びトランザクション開始
sqlite> INSERT INTO users (name, age) VALUES (‘テストユーザー3’, 97);
sqlite> INSERT INTO users (name, age) VALUES (‘テストユーザー4’, 96);
sqlite> COMMIT; — 変更を確定する
sqlite> SELECT * FROM users; — テストユーザー3と4が表示される (コミットされたため)
“`
トランザクションを明示的に利用することで、処理の信頼性を高めることができます。複数のSQL文をまとめて実行する場合や、処理の途中でエラーが発生した場合に元に戻したい場合などに使用します。
第6章:実践!簡単なデータベースを作ってみよう
これまでに学んだ知識を使って、実際に簡単なデータベースを作成し、操作してみましょう。「書籍リスト」を管理するデータベースを作成します。
-
データベースファイルを作成・開く:
ターミナルを開き、sqlite3
コマンドで新しいデータベースファイルを作成します。bash
sqlite3 book_manager.db
sqlite>
プロンプトが表示されます。 -
コマンドラインツールの表示設定を行う:
結果が見やすくなるように設定します。sqlite
sqlite> .mode column
sqlite> .headers on
これで、SELECT結果が整形されて表示されるようになります。 -
テーブルを作成する (
books
テーブル):
書籍情報を格納するbooks
テーブルを作成します。book_id
: 主キー、自動採番title
: 書籍名、必須、文字列author
: 著者名、必須、文字列published_year
: 出版年、整数isbn
: ISBN、一意、文字列
sql
CREATE TABLE books (
book_id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
author TEXT NOT NULL,
published_year INTEGER,
isbn TEXT UNIQUE
);
テーブルが作成できたか確認します。sqlite
sqlite> .tables
books
テーブルのスキーマも確認してみましょう。sqlite
sqlite> .schema books
CREATE TABLE books (
book_id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
author TEXT NOT NULL,
published_year INTEGER,
isbn TEXT UNIQUE
); -
データを挿入する (
INSERT
):
作成したテーブルに書籍データをいくつか挿入します。sql
INSERT INTO books (title, author, published_year, isbn) VALUES
('坊っちゃん', '夏目漱石', 1906, '978-4101010017'),
('吾輩は猫である', '夏目漱石', 1905, '978-4101010024'),
('羅生門', '芥川龍之介', 1915, '978-4101020016'),
('走れメロス', '太宰治', 1940, NULL); -- ISBNはNULLを許容する(UNIQUE制約はNULLに適用されない) -
データを取得する (
SELECT
):
挿入したデータを確認したり、様々な条件でデータを取得してみましょう。“`sqlite
— 全ての書籍を表示
SELECT * FROM books;— 書籍名と著者名だけを表示
SELECT title, author FROM books;— 出版年が1915年以降の書籍を表示
SELECT * FROM books WHERE published_year >= 1915;— 夏目漱石の書籍を表示
SELECT * FROM books WHERE author = ‘夏目漱石’;— 書籍名に「猫」が含まれる書籍を表示
SELECT * FROM books WHERE title LIKE ‘%猫%’;— 出版年で昇順にソートして表示
SELECT * FROM books ORDER BY published_year ASC;— 著者名で昇順、出版年で降順にソートして表示
SELECT * FROM books ORDER BY author ASC, published_year DESC;— 書籍の総数をカウント
SELECT COUNT(*) FROM books;— 出版年ごとの書籍数をカウント
SELECT published_year, COUNT(*) FROM books GROUP BY published_year;
“` -
データを更新する (
UPDATE
):
既存のデータを更新してみましょう。“`sql
— 「走れメロス」のISBNを追加する (book_idが4だと仮定)
UPDATE books SET isbn = ‘978-4101003033’ WHERE book_id = 4;— 夏目漱石の書籍の出版年を全て+1年する (例:間違いに気づいた場合)
— 注意:この操作は実際にやることは稀です
UPDATE books SET published_year = published_year + 1 WHERE author = ‘夏目漱石’;— 更新後のデータを確認
SELECT * FROM books;
“` -
データを削除する (
DELETE
):
不要になったデータを削除してみましょう。“`sql
— ISBNがNULLの書籍を削除 (book_idが4はISBNを更新したので削除されないはず)
DELETE FROM books WHERE isbn IS NULL;— 出版年が1910年より前の書籍を全て削除
DELETE FROM books WHERE published_year < 1910;— 削除後のデータを確認
SELECT * FROM books;
“` -
ツールを終了する:
データベースへの変更は自動的に保存されます。sqlite
sqlite> .quit
これで、簡単なデータベースの作成からCRUD操作まで一通り行うことができました。book_manager.db
というファイルが作成されていることを確認してみてください。このファイルを他のコンピュータにコピーすれば、同じデータベース環境をすぐに再現できます。
第7章:GUIツールを使ってみよう(任意)
コマンドラインツールは便利ですが、テーブルの構造を俯瞰したり、データを視覚的に確認したりする際には、GUIツールの方が使いやすい場合があります。SQLite用のGUIツールはいくつかありますが、ここでは無料で高機能な「DB Browser for SQLite」(以前のSQLiteBrowser)を紹介します。
7.1 DB Browser for SQLiteの紹介
DB Browser for SQLiteは、SQLiteデータベースファイルを作成、設計、編集できるオープンソースのツールです。
- テーブル、インデックス、レコードの作成・変更・削除が視覚的に行えます。
- SQL文を実行し、結果を整形されたテーブル形式で確認できます。
- データのインポート・エクスポート機能もあります。
コマンドラインツールと組み合わせて使うことで、より効率的にSQLiteデータベースを扱うことができます。
7.2 インストール方法(簡単な説明)
DB Browser for SQLiteの公式サイトから、お使いのOSに合わせたインストーラーをダウンロードして実行するだけです。
公式サイト: https://sqlitebrowser.org/
Windows, macOS, Linux版が提供されています。特別な設定は不要で、通常のアプリケーションと同じようにインストールできます。
7.3 主な機能
- Database Structure (データベース構造): テーブル、ビュー、インデックスなどの一覧表示とスキーマ確認、作成、変更、削除。
- Browse Data (データを参照): テーブルを選択して、その中のデータを表形式で表示、編集、追加、削除。フィルタリングやソートも簡単に行えます。
- Execute SQL (SQLを実行): SQLエディタでSQL文を入力して実行し、結果を下のペインに表示。コマンドラインツールと同様のSQLが利用できます。
- Export (エクスポート): データベース全体、または特定のテーブルのデータをCSV, SQL, Excelなどの形式で出力。
- Import (インポート): CSVファイルなどからデータをインポートしてテーブルに追加または新規作成。
GUIツールを使うことで、特に初心者のうちはデータベースの構造やデータの内容を直感的に把握しやすくなります。SQLの学習が進んだら、コマンドラインとGUIツールを使い分けてみることをお勧めします。
第8章:SQLiteを使う上での注意点
SQLiteは非常に便利ですが、いくつかの注意点があります。これらを理解しておくことで、トラブルを避け、より適切にSQLiteを活用できます。
8.1 並行書き込みの限界とWALモード
前述の通り、SQLiteの最も大きな弱点は複数のプロセスからの同時書き込みです。デフォルトのジャーナルモード(DELETEモードまたはTRUNCATEモード)では、書き込み時にはデータベースファイル全体がロックされます。これにより、同時に複数の書き込み要求があると、他の書き込み処理は待たされるか、タイムアウトエラーが発生します。
これを改善するために導入されたのが WAL (Write-Ahead Logging) モードです。WALモードでは、変更内容をまず別のログファイル (.db-wal
) に書き込み、後でデータベースファイル (.db
) に反映(チェックポイント処理)します。これにより、書き込み中でも読み込みが可能になり、読み込みと書き込みの並行処理が可能になります。
複数のプロセスが同時に書き込みを行うことは依然として難しいですが(ログファイルへの書き込みロックが発生)、読み込み性能が向上し、多くのシナリオで並行性が改善されます。
WALモードを有効にするには、PRAGMA journal_mode = WAL;
というSQL文を実行します。
sqlite
sqlite> PRAGMA journal_mode = WAL;
wal -- 有効になったことを示す
一度有効にすれば、次回データベースを開いたときもWALモードが維持されます。ただし、関連する .db-wal
および .db-shm
ファイルが生成・管理されることになります。
8.2 データ型(動的型付けとAffinity Type)
SQLiteのデータ型は、他の厳密な静的型付けのRDBMS(MySQL, PostgreSQLなど)とは異なります。SQLiteは宣言された型名に基づいて「型アフィニティ」を決定しますが、実際のデータは内部的に INTEGER
, REAL
, TEXT
, BLOB
, NULL
のいずれかのストレージクラスとして格納されます。
例えば、INT
型で宣言された列に文字列を挿入することも可能です。
sql
CREATE TABLE test (a INT);
INSERT INTO test (a) VALUES ('Hello'); -- エラーにならない
SELECT typeof(a) FROM test; -- 実行結果: text
これは柔軟性がある一方で、意図しないデータ型の値が挿入されるリスクがあります。データの整合性を厳密に保ちたい場合は、アプリケーション側で入力値をチェックするか、SQLite 3.37.0以降で導入された STRICT
テーブルモードを利用する必要があります。
sql
CREATE TABLE strict_test (a INTEGER, b TEXT) STRICT;
INSERT INTO strict_test (a) VALUES ('Hello'); -- エラーになる
初心者の方は、まずは一般的なRDBと同じ感覚でデータ型(INTEGER, TEXT, REALなど)を指定し、入力値はアプリケーション側で適切に処理することを心がけると良いでしょう。
8.3 制約(外部キー制約のデフォルト無効)
SQLiteは PRIMARY KEY
, UNIQUE
, NOT NULL
, CHECK
, FOREIGN KEY
といった制約をサポートしていますが、外部キー制約はデフォルトで無効になっています。
外部キー制約を有効にしないと、参照整合性(親テーブルに存在しない子テーブルのデータが登録されたり、子テーブルから参照されている親テーブルのデータが削除されたりするのを防ぐ仕組み)が働きません。
外部キー制約を有効にするには、データベースに接続するたびに以下のSQL文を実行する必要があります。
sql
PRAGMA foreign_keys = ON;
通常、アプリケーションからSQLiteに接続する際は、接続確立直後にこの PRAGMA
文を実行するのが一般的です。コマンドラインツールで操作する場合も、.open
の後などに実行しておくと良いでしょう。
8.4 バックアップとリストア
SQLiteデータベースは単一ファイルなので、バックアップは非常に簡単です。基本的にはデータベースファイルをコピーするだけです。ただし、アプリケーションがデータベースファイルを開いている最中にコピーすると、不整合なファイルになる可能性があります。バックアップを取得する際は、アプリケーションを停止するか、SQLiteが提供するオンラインバックアップAPIを利用するのが安全です。
リストアは、バックアップしたデータベースファイルと既存のファイルを置き換えるだけです。
第9章:さらにステップアップするために
SQLiteの基本的な使い方をマスターしたら、さらにデータベースやSQLについて学びを深めてみましょう。
- トランザクションについて深く学ぶ: ロックのメカニズム、分離レベル(SQLiteはシリアライザブル相当)など、トランザクションの仕組みを理解することは、堅牢なアプリケーション開発に不可欠です。
- インデックスについて学ぶ:
CREATE INDEX
文を使ってインデックスを作成すると、SELECT
文(特にWHERE
句による絞り込みやJOIN
)の性能を劇的に向上させることができます。どのような列にインデックスを作成すると効果的か、インデックスの仕組みなどを学びましょう。 - ビュー、トリガーについて学ぶ:
- ビュー (View):
SELECT
文の結果に名前を付けた仮想的なテーブル。複雑なクエリを単純化したり、特定の列だけをユーザーに見せたりするのに役立ちます。CREATE VIEW
文で作成します。 - トリガー (Trigger):
INSERT
,UPDATE
,DELETE
といった特定のイベントが発生した際に、自動的に実行される処理を定義できます。データの整合性維持などに利用されます。CREATE TRIGGER
文で作成します。
- ビュー (View):
- プログラミング言語からのSQLite利用: 実際のアプリケーションでは、Python, Java, PHP, Node.jsなどのプログラミング言語からSQLiteデータベースにアクセスすることがほとんどです。各言語にはSQLiteを操作するためのライブラリ(ドライバ)が用意されています。これらのライブラリの使い方を学び、独自のアプリケーションを作成してみましょう。基本的なSQL文の知識はそのまま活かせます。
- 公式ドキュメントを読む: SQLiteの公式サイトには、非常に詳細なドキュメントが公開されています。SQLiteの内部構造や、より高度な機能について学ぶことができます。最初は難しく感じるかもしれませんが、何か疑問に思ったときに参照する習慣をつけると良いでしょう。
- 他のデータベースシステムを知る: MySQL, PostgreSQL, SQL Server, Oracleなどのサーバー型データベースについても調べてみましょう。それぞれの特徴や得意なこと、不得意なことを知ることで、どのようなシステムにどのデータベースが適しているのかを判断できるようになります。SQLiteで学んだSQLの知識は、これらのデータベースでもほとんどそのまま通用します。
まとめ
この記事では、データベースの基本的な概念から始め、SQLiteという軽量で手軽なRDBMSの特徴、メリット・デメリット、そしてコマンドラインツールを使った基本的な操作方法(テーブル作成、CRUD)までを詳しく解説しました。
SQLiteは、その導入・管理の容易さ、サーバレスであるというユニークな特徴から、特にデスクトップ・モバイルアプリケーションや組み込みシステム、そして学習用途に非常に適しています。
SQLiteで学ぶことの意義:
- データベースの基本: RDBの構造(テーブル、行、列、キー)や、データの整合性、トランザクションといったデータベースの根幹となる考え方を、手軽な環境で実践的に学べます。
- SQLの基本: データを操作するための標準言語であるSQLの基本的な構文(SELECT, INSERT, UPDATE, DELETE, CREATE TABLEなど)を習得できます。ここで学んだSQLの知識は、他の多くのRDBMSでもそのまま通用する普遍的なスキルです。
- プログラミングへの応用: SQLiteは様々なプログラミング言語から簡単に利用できます。データベースを扱うスキルは、アプリケーション開発において非常に重要です。
この記事で紹介した内容は、SQLiteそしてデータベースの世界のほんの入り口に過ぎません。しかし、ここからさらに学びを深めていくための土台はできたはずです。
まずは、この記事で紹介したコマンドラインツールやGUIツールを使って、実際に手を動かしながら様々なSQL文を試してみてください。エラーを恐れず、試行錯誤することが習得への一番の近道です。
データベースの知識とSQLのスキルは、ITエンジニアにとって非常に強力な武器となります。SQLiteを足がかりに、ぜひデータベースの世界をさらに探求していってください。あなたの学習を応援しています!