はい、承知いたしました。sqlite3コマンドの基本について、約5000語の詳細な解説記事を作成し、直接表示します。
今すぐ使える!sqlite3 コマンド 基本マスターガイド
データベースといえば、MySQLやPostgreSQL、Oracle Databaseといった大規模なものを想像するかもしれません。しかし、「もっと手軽に、設定なしで、ファイル一つでデータベースを使いたい」という場面も少なくありません。そんな時に活躍するのが SQLite です。
SQLiteは、特別なサーバープロセスを必要としない、組み込み可能なSQLデータベースエンジンです。その最大の特長は、データベース全体が単一のファイルとして管理されること。アプリケーションに簡単に組み込めるだけでなく、コマンドラインツールを使えば、気軽にデータベースの作成、データの操作、管理ができます。
この記事では、SQLiteを操作するためのコマンドラインツールである sqlite3
コマンドに焦点を当て、その基本的な使い方から、データベースの作成、テーブルの定義、データの追加、検索、更新、削除といった一連の操作を、具体的な例を交えながら徹底的に解説します。この記事を読めば、あなたも今日からsqlite3
コマンドを使いこなし、データを効率的に管理できるようになるでしょう。
1. SQLite と sqlite3 コマンドについて
1.1 SQLite とは?なぜ使うのか?
SQLiteは「サーバーレス」なトランザクションSQLデータベースエンジンです。一般的なデータベースシステム(RDBMS)は、クライアントとサーバーという構造で動作しますが、SQLiteはアプリケーション自身がデータベースエンジンとして動作します。これにより、以下のようなメリットが得られます。
- 設定が不要: データベースサーバーのインストールや設定が一切不要です。ファイルを一つ用意するだけでデータベースとして機能します。
- 軽量で高速: リソース消費が非常に少なく、多くの操作が高速です。
- ポータブル: データベースファイルはOSやアーキテクチャに依存しません。ファイルをコピーするだけで別の環境に移動できます。
- 組み込みやすい: Cライブラリとして提供されており、様々なプログラミング言語から簡単に利用できます。Webブラウザ(Firefox, Chromeなど)、スマートフォンのアプリ(Android, iOS)、多くのデスクトップアプリケーション(Skype, Adobe Lightroomなど)の内部データストアとして広く利用されています。
- 手軽なコマンドラインツール:
sqlite3
コマンドを使うことで、プログラムを書かなくてもデータベースの操作や管理ができます。
学習やプロトタイピング、小規模なデータ管理、設定情報の保存、テストデータの作成など、様々な場面でSQLiteはその手軽さと高機能さから選ばれています。
1.2 sqlite3
コマンドとは?
sqlite3
コマンドは、SQLiteデータベースファイルを操作するための公式なコマンドラインツールです。このツールを使うことで、以下のことができます。
- 新しいSQLiteデータベースファイルを作成する。
- 既存のSQLiteデータベースファイルを開く。
- SQLステートメントを実行する(テーブルの作成、データの追加、検索、更新、削除など)。
- データベースの構造を表示する。
.
(ドット)で始まる特殊なコマンド(ドットコマンド)を使用して、環境設定やファイル操作を行う。- SQLスクリプトファイルを実行する。
まるで対話型シェルやインタプリタのように使うことができ、非常に直感的です。
2. sqlite3 コマンドを起動・終了する
sqlite3
コマンドを使い始める最も基本的な方法を見てみましょう。
2.1 起動方法
ターミナル(コマンドプロンプトやPowerShell)を開き、sqlite3
と入力してEnterキーを押します。
bash
$ sqlite3
sqlite3
を引数なしで起動した場合、メモリ上に一時的なデータベースが作成されます。これはディスクに保存されないため、練習用としては良いですが、データを永続化したい場合は起動時にファイル名を指定します。
bash
$ sqlite3 mydatabase.db
このコマンドを実行すると、以下のようになります。
mydatabase.db
というファイルが存在しない場合: 新しい空のデータベースファイルが作成されます。mydatabase.db
というファイルが存在する場合: そのデータベースファイルが開かれます。
どちらの場合も、sqlite3
のプロンプトが表示され、対話的な操作が可能になります。プロンプトは通常 sqlite>
のようになります。
$ sqlite3 mydatabase.db
SQLite version 3.38.5 2022-05-06 19:26:45
Enter ".help" for usage hints.
sqlite>
これで、データベースを操作する準備ができました。
2.2 終了方法
sqlite3
の対話モードを終了するには、プロンプトで以下のドットコマンドを入力します。
sql
sqlite> .quit
または
sql
sqlite> .exit
Enterキーを押すと、sqlite3
セッションが終了し、元のターミナルに戻ります。
注意点: データベースファイル名を指定して起動した場合、.quit
や.exit
で終了すると、それまでに行った変更は自動的に保存されます(特別な設定をしない限り)。
3. sqlite3 の基本的なドットコマンド
sqlite3
コマンドラインツールには、SQLステートメントの実行以外に、ツール自身の挙動を制御したり、ファイル操作を行ったりするための特殊なコマンドがあります。これらは .
(ドット) から始まるため、「ドットコマンド」と呼ばれます。SQLステートメントとは異なり、ドットコマンドの最後にセミコロン(;)は不要です(付けてもエラーにはなりませんが、推奨されません)。
ここでは、特に利用頻度の高い基本的なドットコマンドを紹介します。
3.1 .help
– ヘルプの表示
これが最初の友達です。利用可能なドットコマンドのリストと簡単な説明を表示します。
sql
sqlite> .help
たくさんのコマンドが表示されますが、最初は全てを覚える必要はありません。困ったときはとりあえず.help
を実行してみましょう。
3.2 .databases
– 接続中のデータベースを表示
現在接続しているデータベースファイルとそのエイリアス(通常はmain
)を表示します。
sql
sqlite> .databases
main: /path/to/your/directory/mydatabase.db
3.3 .tables
– テーブル一覧の表示
現在のデータベース内に存在するテーブルやビューの一覧を表示します。
sql
sqlite> .tables
まだ何もテーブルを作成していない場合は、何も表示されません。テーブルを作成すると、ここに名前が表示されるようになります。
3.4 .schema
– テーブル定義の表示
指定したテーブルの CREATE TABLE
文を表示します。テーブルの構造を確認したいときに非常に便利です。テーブル名を指定しない場合、全てのテーブルの定義を表示します。
sql
sqlite> .schema users
(例として users
テーブルの定義を表示する場合)
もしテーブル名がわからない場合は、まず.tables
で確認してから.schema
を使うと良いでしょう。
3.5 .mode
と .headers
– 出力形式の制御
SELECT
ステートメントなどでデータを表示する際の形式を制御します。
.mode モード名
: 出力モードを指定します。よく使うモードには以下があります。list
(デフォルト): 区切り文字(デフォルトは|
)で区切られた形式。column
: カラム幅を調整して整列された形式。見やすいので最もよく使われます。csv
: CSV (Comma Separated Values) 形式。html
: HTMLのテーブル形式。json
: JSON配列形式。tabs
: タブ区切り形式。line
: 1行に1カラムずつ表示する形式。
.headers on/off
: 結果にヘッダー(カラム名)を表示するかどうかを切り替えます。column
モードと組み合わせて使うと、より出力が見やすくなります。
例: 整列された形式でヘッダー付きで表示する設定
sql
sqlite> .mode column
sqlite> .headers on
一度設定すると、明示的に変更しない限りそのモードが維持されます。
3.6 .import
と .output
/ .dump
– データのインポート・エクスポート
.import ファイル名 テーブル名
: 指定したファイルからデータを読み込み、指定したテーブルにインポートします。ファイルの形式は.mode
の設定に依存しますが、通常はCSVやタブ区切りが使われます。.mode csv
を設定してから.import
を使うのが一般的です。.output ファイル名
: 以降のSELECT
などの結果を、標準出力ではなく指定したファイルに書き出します。ファイル名を指定しないか、stdout
と指定すると標準出力に戻ります。.dump [テーブル名]
: データベース全体のSQLダンプ(テーブル作成文とデータ挿入文)または指定したテーブルのダンプを生成します。これをファイルにリダイレクトして保存しておけば、データベースのバックアップとして利用できます。
例: CSVファイルからデータをインポート
sql
sqlite> .mode csv
sqlite> .import users.csv users
例: テーブルのデータをCSVファイルにエクスポート
sql
sqlite> .mode csv
sqlite> .headers on
sqlite> .output users_export.csv
sqlite> SELECT * FROM users;
sqlite> .output stdout -- 標準出力に戻す
例: データベース全体のダンプを作成
sql
sqlite> .output backup.sql
sqlite> .dump
sqlite> .output stdout -- 標準出力に戻す
これらのドットコマンドを使いこなすことで、sqlite3
コマンドラインツールでの作業効率が格段に上がります。
4. 基本的なSQLコマンド
いよいよ、データベースの心臓部であるSQLステートメントを使った操作に進みましょう。SQLはStructured Query Language(構造化クエリ言語)の略で、データベースを操作するための標準的な言語です。SQLiteはSQLの多くの機能をサポートしています。
SQLステートメントは通常、キーワードで始まり、最後にセミコロン(;)を付けて終了します。sqlite3
の対話モードでは、セミコロンがない場合、コマンドが複数行にまたがっていると解釈され、セミコロンを入力するまで待ちます。
4.1 テーブルを作成する: CREATE TABLE
データを格納するには、まずテーブルを作成する必要があります。テーブルは、カラム(列)と行で構成されるデータの構造を定義します。
sql
CREATE TABLE テーブル名 (
カラム名1 データ型 [制約],
カラム名2 データ型 [制約],
...
[テーブル制約]
);
CREATE TABLE
: テーブルを作成するためのSQLキーワードです。テーブル名
: 作成したいテーブルの名前を指定します。( ... )
: カラムの定義をカンマ区切りで列挙します。カラム名 データ型
: 各カラムの名前とそのカラムに格納できるデータの型を指定します。[制約]
: そのカラムに適用する制約を指定します(例:PRIMARY KEY
,NOT NULL
,UNIQUE
,DEFAULT
)。[テーブル制約]
: 複数のカラムにまたがる制約などを指定します。
SQLiteの主要なデータ型
SQLiteは、厳密なデータ型ではなく「データ型アフィニティ」という概念を使用しますが、以下の型名を指定するのが一般的です。実際に内部でどのように扱われるかは、指定した型名とデータによってSQLiteが決定します。
NULL
: 値なし。INTEGER
: 符号付き整数。格納できる値の範囲に応じて1, 2, 3, 4, 6, または8バイトの整数として格納されます。PRIMARY KEY
に指定すると、エイリアスであるROWID
として扱われることが多く、自動的に連番が振られます(整数主キーの自動増分)。REAL
: 浮動小数点数。8バイトのIEEE浮動小数点数として格納されます。TEXT
: テキスト文字列。データベースのエンコーディング(通常UTF-8)で格納されます。BLOB
: バイナリデータ。入力されたそのままの形式で格納されます(画像ファイルや音声ファイルなど)。
よく使われるカラム制約
PRIMARY KEY
: 主キー。そのカラムの値はテーブル内で一意であり、NULLであってはいけません。通常、テーブルの各行を一意に識別するために使用されます。INTEGER PRIMARY KEY
は特別な意味を持ち、自動的に連番が振られます。NOT NULL
: そのカラムにNULL値を格納することを禁止します。UNIQUE
: そのカラムの値はテーブル内で一意でなければなりません。NULL値は複数存在できます(厳密にはNULLは他のNULLとは一致しないため)。DEFAULT デフォルト値
: 値が指定されなかった場合に自動的に挿入される値を指定します。CHECK (条件)
: 指定した条件を満たす値のみを格納できるようにします。FOREIGN KEY
: 外部キー。他のテーブルのカラムを参照し、参照整合性を維持するために使用されます。
テーブル作成例
ユーザー情報を管理する users
テーブルを作成してみましょう。ID (自動連番)、名前 (必須)、年齢 (必須)、メールアドレス (ユニーク) を持つとします。
sql
sqlite> CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- 自動増分される整数主キー
name TEXT NOT NULL, -- 必須のテキスト
age INTEGER NOT NULL, -- 必須の整数
email TEXT UNIQUE -- ユニークなテキスト
);
コマンドが成功しても、通常は何も表示されません。
.tables
コマンドで確認してみましょう。
sql
sqlite> .tables
users
.schema
コマンドで構造を確認してみましょう。
sql
sqlite> .schema users
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER NOT NULL,
email TEXT UNIQUE
);
これで users
テーブルが作成されました。
4.2 データを追加する: INSERT INTO
作成したテーブルに新しい行を追加するには、INSERT INTO
ステートメントを使用します。
sql
INSERT INTO テーブル名 (カラム名1, カラム名2, ...)
VALUES (値1, 値2, ...);
または、全てのカラムに値を追加する場合(カラムの定義順に値を指定)、カラム名のリストは省略できます。
sql
INSERT INTO テーブル名 VALUES (値1, 値2, ...);
値の指定方法
- 文字列リテラルはシングルクォーテーション (
'
) で囲みます。文字列中に'
を含めたい場合は''
と二重に記述します。 - 数値リテラルはそのまま記述します。
- NULL値は
NULL
と記述します。
データ追加例
先ほど作成した users
テーブルにデータを追加してみましょう。id
はAUTOINCREMENT
なので、指定する必要はありません。
sql
sqlite> INSERT INTO users (name, age, email) VALUES ('山田 太郎', 30, '[email protected]');
カラムリストを省略する場合(全てのカラム、idを除く):
sql
sqlite> INSERT INTO users VALUES (NULL, '山田 花子', 25, '[email protected]'); -- AUTOINCREMENTなのでidはNULLを指定
複数の行を一度に追加することもできます。
sql
sqlite> INSERT INTO users (name, age, email) VALUES
('田中一郎', 40, '[email protected]'),
('佐藤美咲', 22, '[email protected]');
データが追加されても、通常は何も表示されません。
4.3 データを検索/取得する: SELECT
データベース操作の中で最も頻繁に行われるのがデータの検索です。SELECT
ステートメントは、テーブルから条件に一致するデータを行として取得します。
sql
SELECT カラム名1, カラム名2, ... または *
FROM テーブル名
[WHERE 条件]
[GROUP BY カラム名]
[HAVING 条件]
[ORDER BY カラム名 [ASC|DESC]]
[LIMIT 数 [OFFSET 数]];
SELECT
: データを取得するためのキーワードです。カラム名1, カラム名2, ...
: 取得したいカラムを指定します。複数ある場合はカンマで区切ります。*
: 全てのカラムを取得する場合に指定します。FROM テーブル名
: どのテーブルからデータを取得するかを指定します。[WHERE 条件]
: 取得する行を絞り込むための条件を指定します。[GROUP BY カラム名]
: 指定したカラムの値に基づいて行をグループ化します。集計関数と組み合わせてよく使われます。[HAVING 条件]
:GROUP BY
でグループ化された後のグループに対する条件を指定します。[ORDER BY カラム名 [ASC|DESC]]
: 指定したカラムの値で結果をソートします。ASC
は昇順(デフォルト)、DESC
は降順です。[LIMIT 数 [OFFSET 数]]
: 取得する行数を制限したり、特定のオフセットから取得したりします(ページネーションなどに使用)。
基本的なSELECT例
users
テーブルの全てのデータを取得してみましょう。先に .mode column
と .headers on
を設定しておくと見やすくなります。
sql
sqlite> .mode column
sqlite> .headers on
sqlite> SELECT * FROM users;
出力例(実際のIDは異なります):
“`
id name age email
1 山田 太郎 30 [email protected]
2 山田 花子 25 [email protected]
3 田中一郎 40 [email protected]
4 佐藤美咲 22 [email protected]
“`
特定のカラムのみを取得する場合:
sql
sqlite> SELECT name, age FROM users;
出力例:
“`
name age
山田 太郎 30
山田 花子 25
田中一郎 40
佐藤美咲 22
“`
WHERE
句による条件絞り込み
特定の条件に一致する行だけを取得します。WHERE
の後ろには、条件式を記述します。
- 比較演算子:
=
,!=
(または<>
),>
,<
,>=
,<=
- 論理演算子:
AND
,OR
,NOT
- その他の演算子:
LIKE
,IN
,BETWEEN
,IS NULL
,IS NOT NULL
例: 年齢が30歳以上のユーザーを検索
sql
sqlite> SELECT * FROM users WHERE age >= 30;
例: 名前が「山田」で始まるユーザーを検索 (LIKE
と %
でパターンマッチング)
sql
sqlite> SELECT * FROM users WHERE name LIKE '山田%';
例: メールアドレスがNULLでないユーザーを検索
sql
sqlite> SELECT * FROM users WHERE email IS NOT NULL;
例: 年齢が20歳以上かつ40歳未満のユーザーを検索 (AND
を使用)
sql
sqlite> SELECT * FROM users WHERE age >= 20 AND age < 40;
例: 名前が「山田 太郎」または「佐藤美咲」のユーザーを検索 (OR
を使用)
sql
sqlite> SELECT * FROM users WHERE name = '山田 太郎' OR name = '佐藤美咲';
より簡潔に書くなら IN
句も使えます。
sql
sqlite> SELECT * FROM users WHERE name IN ('山田 太郎', '佐藤美咲');
例: 年齢が20歳から30歳の間のユーザーを検索 (BETWEEN
を使用、指定した範囲を含む)
sql
sqlite> SELECT * FROM users WHERE age BETWEEN 20 AND 30;
ORDER BY
句によるソート
結果を指定したカラムで並べ替えます。
例: 年齢の若い順(昇順)に並べ替える
sql
sqlite> SELECT * FROM users ORDER BY age ASC;
ASC
は省略可能です。
例: IDの大きい順(降順)に並べ替える
sql
sqlite> SELECT * FROM users ORDER BY id DESC;
複数のカラムでソートすることも可能です。カンマで区切って指定します。先に指定したカラムでソートし、値が同じ場合は次に指定したカラムでソートします。
例: 年齢で昇順に並べ、同じ年齢の場合は名前で昇順に並べる
sql
sqlite> SELECT * FROM users ORDER BY age ASC, name ASC;
LIMIT
と OFFSET
による件数制限
取得する行数を制限したい場合に使います。
例: 最初の2件だけを取得
sql
sqlite> SELECT * FROM users LIMIT 2;
例: 3件目から2件だけを取得 (オフセットは0から始まります)
sql
sqlite> SELECT * FROM users LIMIT 2 OFFSET 2;
これは、IDが3と4のユーザーを取得することになります。
集計関数と GROUP BY
データの合計、平均、件数などを計算する場合に集計関数を使用します。
COUNT(カラム名または *)
: 条件に一致する行数またはNULLでない値の数を数えます。SUM(カラム名)
: 数値カラムの合計値を計算します。AVG(カラム名)
: 数値カラムの平均値を計算します。MIN(カラム名)
: カラムの最小値を計算します。MAX(カラム名)
: カラムの最大値を計算します。
例: ユーザーの総数を数える
sql
sqlite> SELECT COUNT(*) FROM users;
例: ユーザーの平均年齢を計算する
sql
sqlite> SELECT AVG(age) FROM users;
GROUP BY
を使うと、指定したカラムの値ごとにグループを作り、そのグループ内で集計を行います。
例: 年齢ごとに人数を数える
sql
sqlite> SELECT age, COUNT(*) FROM users GROUP BY age;
出力例:
“`
age COUNT(*)
22 1
25 1
30 1
40 1
“`
もし、年齢が重複しているユーザーがいたら、その年齢の行の COUNT(*)
が2以上になります。
HAVING
句は GROUP BY
でグループ化された結果に対して条件を適用します。WHERE
句が集計前の個々の行に条件を適用するのに対し、HAVING
句は集計後のグループに条件を適用します。
例: 年齢ごとの人数を数え、人数が2人以上のグループだけを表示する
sql
sqlite> SELECT age, COUNT(*) FROM users GROUP BY age HAVING COUNT(*) >= 2;
(現在のデータでは年齢が重複していないため何も表示されません)
4.4 データを更新する: UPDATE
既存のテーブルのデータを変更するには、UPDATE
ステートメントを使用します。
sql
UPDATE テーブル名
SET カラム名1 = 新しい値1, カラム名2 = 新しい値2, ...
[WHERE 条件];
UPDATE
: データを更新するためのキーワードです。テーブル名
: 更新したいテーブルを指定します。SET カラム名 = 新しい値, ...
: 更新したいカラムと、その新しい値を指定します。複数のカラムを更新する場合はカンマで区切ります。[WHERE 条件]
: 更新する行を絞り込むための条件を指定します。この句を省略すると、テーブルの全ての行が更新されてしまうので注意が必要です!
データ更新例
例: IDが1のユーザーの年齢を31歳に更新する
sql
sqlite> UPDATE users SET age = 31 WHERE id = 1;
例: メールアドレスが指定されていない全てのユーザーに、デフォルトのメールアドレスを設定する
sql
sqlite> UPDATE users SET email = '[email protected]' WHERE email IS NULL;
更新が成功しても、通常は何も表示されません。SELECT
で確認してみましょう。
sql
sqlite> SELECT * FROM users WHERE id = 1;
出力例:
“`
id name age email
1 山田 太郎 31 [email protected]
“`
4.5 データを削除する: DELETE FROM
テーブルから行を削除するには、DELETE FROM
ステートメントを使用します。
sql
DELETE FROM テーブル名
[WHERE 条件];
DELETE FROM
: データを削除するためのキーワードです。テーブル名
: 削除したい行が含まれるテーブルを指定します。[WHERE 条件]
: 削除する行を絞り込むための条件を指定します。この句を省略すると、テーブルの全ての行が削除されてしまうので細心の注意が必要です!
データ削除例
例: IDが4のユーザーを削除する
sql
sqlite> DELETE FROM users WHERE id = 4;
例: 年齢が20歳未満の全てのユーザーを削除する
sql
sqlite> DELETE FROM users WHERE age < 20;
削除が成功しても、通常は何も表示されません。SELECT
で確認してみましょう。
sql
sqlite> SELECT * FROM users;
出力例(ID=4の佐藤美咲が消えている):
“`
id name age email
1 山田 太郎 31 [email protected]
2 山田 花子 25 [email protected]
3 田中一郎 40 [email protected]
“`
4.6 テーブル構造を変更する: ALTER TABLE
既存のテーブルの構造を変更する場合、ALTER TABLE
ステートメントを使用します。SQLiteでサポートされているALTER TABLE
の操作は、他のRDBMSに比べて限定的です。
- カラムを追加する:
ADD COLUMN
- テーブル名を変更する:
RENAME TO
テーブル構造変更例
例: users
テーブルに hire_date
(入社日) カラムを追加する
sql
sqlite> ALTER TABLE users ADD COLUMN hire_date TEXT;
カラムが追加されても、通常は何も表示されません。.schema
で確認してみましょう。
sql
sqlite> .schema users
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER NOT NULL,
email TEXT UNIQUE,
hire_date TEXT
);
新しいカラムはデフォルトでNULL値が入ります。
例: users
テーブルの名前を employees
に変更する
sql
sqlite> ALTER TABLE users RENAME TO employees;
変更後、.tables
で確認してみましょう。
sql
sqlite> .tables
employees
以降は新しいテーブル名 employees
を使用します。
注意点: SQLiteでは、カラムの削除や、カラムのデータ型・制約の変更は ALTER TABLE
では直接できません。これらの操作を行いたい場合は、新しいテーブルを作成し、そこに既存のデータをコピーし、元のテーブルを削除して新しいテーブル名を変更するという手順が必要になります。これは少し高度な操作になるため、ここでは割愛します。
4.7 テーブルを削除する: DROP TABLE
テーブルとその中に含まれる全てのデータを完全に削除するには、DROP TABLE
ステートメントを使用します。
sql
DROP TABLE テーブル名;
DROP TABLE
: テーブルを削除するためのキーワードです。テーブル名
: 削除したいテーブルを指定します。
テーブル削除例
例: employees
テーブルを削除する
sql
sqlite> DROP TABLE employees;
テーブルが削除されても、通常は何も表示されません。.tables
で確認してみましょう。
sql
sqlite> .tables
何も表示されなくなります。
注意点: DROP TABLE
を実行すると、テーブルとそのデータは完全に削除され、元に戻すことはできません。実行前に十分確認しましょう。
5. さらに便利な sqlite3 の機能
基本的なドットコマンドとSQLステートメントをマスターすれば、多くの作業ができるようになります。ここでは、さらに知っておくと便利なsqlite3
の機能や概念をいくつか紹介します。
5.1 トランザクション
トランザクションは、複数のSQLステートメントを一つの論理的な単位として扱う仕組みです。トランザクション内の全てのステートメントが成功すれば全体の変更が確定(コミット)され、一つでも失敗すれば全ての変更が取り消し(ロールバック)されます。これにより、データの整合性を保つことができます。
SQLiteはデフォルトで「自動コミット」モードで動作します。つまり、各SQLステートメントは実行されるたびに自動的にコミットされます。複数のステートメントをまとめて処理したい場合は、明示的にトランザクションを開始します。
BEGIN TRANSACTION;
またはBEGIN;
: トランザクションを開始します。COMMIT;
: トランザクション内の全ての変更を確定し、終了します。ROLLBACK;
: トランザクション内の全ての変更を取り消し、終了します。
例: 複数のINSERTをまとめて実行し、途中でエラーが起きたら全て取り消す
sql
sqlite> BEGIN;
sqlite> INSERT INTO users (name, age) VALUES ('テスト 1', 20);
-- ここで何らかのエラーが発生したと仮定
sqlite> INSERT INTO users (name, age, email) VALUES ('テスト 2', 21, '[email protected]'); -- 例えばemailが重複している
sqlite> COMMIT; -- もしエラーが起きていなければコミットされるが、エラーがあればこの行まで到達しないか、コミットが失敗する
上記の場合、もし2行目のINSERTでエラーが発生した場合、1行目のINSERTもデータベースには反映されません(自動的にロールバックされるか、手動で ROLLBACK;
を実行する必要があります)。エラーがなければ、両方の行が追加されます。
手動でロールバックする例:
sql
sqlite> BEGIN;
sqlite> INSERT INTO users (name, age) VALUES ('テスト 3', 30);
sqlite> -- 間違えたことに気づいた
sqlite> ROLLBACK;
この場合、「テスト 3」のユーザーはデータベースに追加されません。トランザクションを意識することは、データの信頼性を高める上で重要です。
5.2 インデックス (CREATE INDEX
)
テーブルにデータが増えてくると、SELECT
クエリ(特にWHERE
句やORDER BY
句を使う場合)の速度が遅くなることがあります。これは、データベースが条件に一致する行を見つけるためにテーブル全体をスキャンする必要がある場合があるためです。
インデックスは、特定のカラムの値とそれを含む行の物理的な場所を結びつける索引のようなものです。インデックスを作成すると、データベースはより高速に目的の行を見つけられるようになります。
sql
CREATE INDEX インデックス名 ON テーブル名 (カラム名1 [ASC|DESC], カラム名2 [ASC|DESC], ...);
CREATE INDEX
: インデックスを作成するためのキーワードです。インデックス名
: 作成するインデックスの名前を指定します(テーブル内で一意である必要があります)。ON テーブル名 ( ... )
: どのテーブルの、どのカラムにインデックスを作成するかを指定します。複数のカラムを指定すると複合インデックスになります。
例: users
テーブルの age
カラムにインデックスを作成する
sql
sqlite> CREATE INDEX idx_users_age ON users (age);
これにより、WHERE age = ...
や ORDER BY age
といったクエリが高速化される可能性があります。
注意点: インデックスは読み取り(SELECT)を高速化しますが、データの書き込み(INSERT, UPDATE, DELETE)時にはインデックスも更新する必要があるため、これらの操作にはオーバーヘッドが発生します。また、インデックス自体もディスク領域を消費します。したがって、闇雲にインデックスを作成するのではなく、よく検索条件やソート条件に使われるカラムに対して作成するのが効果的です。
5.3 コマンドの履歴
sqlite3
の対話モードでは、過去に入力したコマンドの履歴が保持されます。矢印キー(↑↓)を使って過去のコマンドを呼び出し、編集して再実行することができます。これは、繰り返し似たようなコマンドを実行する場合や、入力ミスを修正する場合に非常に便利です。
5.4 SQLステートメントをファイルから実行する (.read
)
長いSQLスクリプトや、繰り返し実行したい一連のSQLステートメントがある場合は、それらをテキストファイルに保存し、.read
ドットコマンドを使って実行することができます。
例: setup.sql
というファイルに記述されたSQLを実行する
sql
sqlite> .read setup.sql
これは、データベースの初期設定や、定型的なデータ投入などに便利です。
5.5 非対話モードでの利用
sqlite3
コマンドは、対話モードだけでなく、非対話モードでも利用できます。これにより、シェルスクリプトなどからSQLiteデータベースを操作することが可能です。
非対話モードでは、コマンドライン引数としてSQLステートメントやドットコマンドを指定します。
例: データベースファイルに対して直接SQLを実行する
bash
$ sqlite3 mydatabase.db "SELECT * FROM users WHERE age > 30;"
例: SQLスクリプトファイルを非対話で実行する
bash
$ sqlite3 mydatabase.db < setup.sql
例: .dump
の出力をファイルに保存する
bash
$ sqlite3 mydatabase.db .dump > backup.sql
これらの非対話的な使い方は、自動化されたタスクやバッチ処理でSQLiteを利用する際に役立ちます。
6. よくある疑問とトラブルシューティング
6.1 セミコロンを忘れた場合
sqlite3
の対話モードでは、SQLステートメントはセミコロン(;)で終了する必要があります。セミコロンを忘れると、プロンプトが ...>
のようになり、入力の続きを待っている状態になります。
sql
sqlite> SELECT * FROM users
...>
この状態になったら、残りのステートメントを入力するか、または単にセミコロンだけを入力してEnterを押せば、そこまでに入力したステートメントが実行されます。もし入力をキャンセルしたい場合は、Ctrl+Cを2回押すと中断できます。
6.2 テーブル名やカラム名の入力ミス
テーブル名やカラム名が存在しない場合、no such table: テーブル名
や no such column: カラム名
といったエラーが表示されます。.tables
や .schema テーブル名
を使って、正しい名前を確認しましょう。
6.3 SQL構文エラー
SQLステートメントの記述に誤りがある場合、SQL error: near "何か": syntax error
のようなエラーが表示されます。エラーメッセージの near "何か"
の部分が、エラーが発生した箇所の近くを示唆していることが多いです。ステートメントを見直して、キーワードのスペル、句読点(カンマ、括弧など)、制約の指定などが正しいか確認しましょう。
6.4 データ型のエラー
SQLiteは厳密なデータ型を持たないため、多くの場合はエラーになりませんが、予期しない結果になることがあります。例えば、数値カラムに文字列を挿入した場合、SQLiteはそれを数値に変換しようと試みますが、変換できない場合は0などの値になることがあります。意図したデータ型に合った値を挿入するようにしましょう。
6.5 WHERE
句を付けずに UPDATE
や DELETE
を実行してしまった!
WHERE
句を付けずに UPDATE
を実行すると、テーブルの全ての行が更新されます。DELETE FROM
を実行すると、テーブルの全ての行が削除されます。これは非常に危険な操作です。
もし重要なデータでこれをやってしまった場合、手動で元に戻すのは困難です。このような事態に備えて、データのバックアップ(.dump
コマンドなどで定期的にダンプファイルを作成しておく)が重要になります。
また、不安な操作を行う前には、まず SELECT
文で対象となる行を確認する癖をつけましょう。
sql
sqlite> SELECT COUNT(*) FROM users WHERE age < 20; -- 削除対象が何件あるか確認
件数が意図通りであれば、同じ WHERE
句を使って DELETE
を実行します。
6.6 大文字と小文字の区別
SQLのキーワード(SELECT
, FROM
, WHERE
など)は、大文字でも小文字でも構いません(通常は大文字で記述するスタイルが多いです)。
sql
sqlite> select * from users where age > 30; -- これも有効
一方、テーブル名やカラム名といった識別子は、デフォルトでは大文字/小文字を区別しません。
sql
sqlite> SELECT * FROM USERS; -- users でも USERS でも同じテーブルを参照する
ただし、テーブル名やカラム名をダブルクォーテーション ("
) で囲んで作成した場合、その識別子は大文字/小文字が区別されるようになります。
sql
sqlite> CREATE TABLE "MyTable" (id INTEGER);
sqlite> INSERT INTO "MyTable" VALUES (1); -- OK
sqlite> SELECT * FROM MyTable; -- エラー (MyTable"は存在しない)
sqlite> SELECT * FROM "MyTable"; -- OK
通常はダブルクォーテーションで囲まず、小文字またはキャメルケースで統一しておくと、区別を気にする必要がなくなり楽です。
7. まとめと次のステップ
この記事では、sqlite3
コマンドを使ってSQLiteデータベースを操作するための基本的な手順とコマンドを網羅的に解説しました。
sqlite3
コマンドの起動と終了.
(ドット)コマンドを使ったツール設定やファイル操作(.help
,.databases
,.tables
,.schema
,.mode
,.headers
,.import
,.output
,.dump
)- SQLステートメントを使ったデータベース操作(
CREATE TABLE
,INSERT INTO
,SELECT
,UPDATE
,DELETE FROM
,ALTER TABLE
,DROP TABLE
) SELECT
ステートメントの詳細(WHERE
,ORDER BY
,LIMIT
, 集計関数,GROUP BY
)- トランザクション、インデックスといった応用的な概念
- 非対話モードでの利用方法
- よくある疑問やトラブルシューティング
これらの基本的なコマンドと概念を理解すれば、あなたはもうSQLiteデータベースを自由に操作できるはずです。まずは実際にsqlite3
コマンドを起動し、サンプルデータベースを作成したり、CSVファイルをインポートしてみたりして、手を動かしてみることが重要です。
次のステップとしては、さらに進んだSQLの機能を学ぶことができます。
- JOIN: 複数のテーブルを結合してデータを取得する。
- サブクエリ: クエリの結果を別のクエリの中で利用する。
- ビュー (
CREATE VIEW
): 複雑なSELECTクエリに名前を付けて、仮想的なテーブルとして扱う。 - インデックスの設計: パフォーマンスを考慮したインデックスの選び方や作成方法。
- トリガー (
CREATE TRIGGER
): データベースの変更(INSERT, UPDATE, DELETE)に応じて自動的に実行される処理を定義する。 - SQLiteの特別な関数:
sqlite3
には標準SQL以外の便利な関数も多数用意されています。
また、SQLiteを様々なプログラミング言語(Python, Ruby, PHP, Node.jsなど)から利用する方法を学ぶことで、より実践的なアプリケーション開発に活かすことができるでしょう。
SQLiteはその手軽さと高機能さから、非常に幅広い用途で利用されています。ぜひこの記事を参考に、sqlite3
コマンドを使ったデータ操作を楽しんでください。