SQLiteでリレーショナルデータベース(RDB:Relational Database)についてを見ていきます。
説明の前に実際のデータを使ってみていく事にしましょう。
※ 本記事の為に新しいデータベースファイルを作成することをおすすめします。
ユーザー(users)と入出金(ledger)に関する2つのテーブルを用意します。
スキーマは下記のようにします。
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR
);
CREATE TABLE ledger (
user_id INTEGER NOT NULL,
amount INTEGER NOT NULL,
created_at DATETIME DEFAULT (DATETIME('now', 'localtime'))
);
ledgerテーブルにあります
user_id INTEGER NOT NULL
のNOT NULLはデータがない(NULL)状態で値を挿入する事を禁止という意味で、必ず整数値を挿入という制約を付けています。
ledgerテーブルの各カラムは下記の通りです。
user_id:usersテーブルのidカラムと紐づける為のカラム
amout:金額(入金は正、出金は負)
create_at:記録日時
created_at DATETIME DEFAULT (DATETIME('now', 'localtime'))
のDEFAULT以降の記述はデータを挿入時(INSERT)、指定がなければ現在の時刻を自動で挿入という意味になります。
始めにusersテーブルの方にダミーで値を一つ入れておきます。
sqlite> INSERT INTO users (name) VALUES ("太郎");
sqlite> SELECT * FROM users; +----+------+ | id | name | +----+------+ | 1 | 太郎 | +----+------+
idが 1 のユーザーが追加されました。
今回追加しました太郎さんの入出金のデータ管理をledgerテーブルで行っていきます。
太郎さんが100円の入金を記録する時は下記のクエリを実行します。
sqlite> INSERT INTO ledger (user_id, amount) VALUES (1, 100);
現時点での入出金の状況は下記の通りです。
sqlite> SELECT * FROM ledger; +---------+--------+---------------------+ | user_id | amount | created_at | +---------+--------+---------------------+ | 1 | 100 | 2026-03-16 11:20:20 | +---------+--------+---------------------+
データを挿入する時、user_idに 1 を指定しましたが、これはusersテーブルの方で太郎さんに自動で割り振られたidの値を指定しています。
続いて、太郎さんが50円の出金を記録する時は下記のクエリを実行します。
sqlite> INSERT INTO ledger (user_id, amount) VALUES (1, -50);
現時点での入出金の状況は下記の通りです。
sqlite> SELECT * FROM ledger; +---------+--------+---------------------+ | user_id | amount | created_at | +---------+--------+---------------------+ | 1 | 100 | 2026-03-16 11:20:20 | | 1 | -50 | 2026-03-16 11:23:03 | +---------+--------+---------------------+
SUM関数を使って、現在の太郎さんの金額を確認してみましょう。
sqlite> SELECT SUM(amount) FROM ledger WHERE user_id = 1; +-------------+ | SUM(amount) | +-------------+ | 50 | +-------------+
WHERE句でuser_id = 1にすることで太郎さんに絞り込んで、現在の金額の合計を計算できました。
usersテーブルのidカラムと、ledgerテーブルのuser_idカラムを関連付けてデータを管理する仕組みをリレーショナルデータベース(RDB)と呼びます。