SQLite3でリレーショナルデータベースでデータを管理してみる1

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)と呼びます。

京都の東本願寺で開催されているプログラミング教室で講師をしています。
詳しくはTera schoolを御覧ください。
マインクラフト用ビジュアルエディタを開発しています。

詳しくはinunosinsi/mcws_blockly - githubをご覧ください。