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

今回はSQLite3でリレーショナルデータベースでデータを管理してみる1の続きにになります。

前回はSQLite3のリレーショナルデータベース(RDB)でのデータの管理方法を見ました。

この内容を踏まえた上で、各ユーザーの合算を出力してみます。


データを見やすくするためにusersテーブルに数名程データを挿入します。

sqlite> INSERT INTO users (name) VALUES ("次郎");
sqlite> INSERT INTO users (name) VALUES ("三郎");
sqlite> select * from users;
+----+------+
| id | name |
+----+------+
| 1  | 太郎   |
| 2  | 次郎   |
| 3  | 三郎   |
+----+------+

各ユーザ分の入出金の挿入しておきます。

sqlite> INSERT INTO ledger (user_id, amount) VALUES (2, 150);
sqlite> INSERT INTO ledger (user_id, amount) VALUES (3, 150);



入出金管理で各ユーザーが現在どれ程の金額が登録されているか?を出力してみます。

前回実行しました

sqlite> SELECT SUM(amount) FROM ledger WHERE user_id = 1;

だと任意のユーザーのみの合算が出力されるのみになりまして、各ユーザーの所持金はわかりません。


各ユーザーの所持金を出力するためには、

sqlite> SELECT user_id, SUM(amount) FROM ledger 
   ...> GROUP BY user_id;
+---------+-------------+
| user_id | SUM(amount) |
+---------+-------------+
| 1       | 50          |
| 2       | 150         |
| 3       | 150         |
+---------+-------------+

※ クエリが長文になる場合は、途中で改行しても良いです。クエリの終了は ; を付けます。


SQLの末尾にGROUP BY user_idを追加して、SELECTの後にuser_idの出力の指定を行います。


SUM関数で合算する時にGROUP BYでカラムを指定することで、指定したカラム毎の集計をするようになります。




先程の出力内容では、ユーザーがidでの表記になっていて、誰がどれ程の所持金があるかわかりません。


そのような時はJOINという結合を使って、複数のテーブルを結合して一つのテーブルと見立てて出力する方法を用います。


sqlite> SELECT users.name, SUM(ledger.amount) FROM ledger 
   ...> INNER JOIN users 
   ...> ON ledger.user_id = users.id 
   ...> GROUP BY ledger.user_id;
+------+--------------------+
| name | SUM(ledger.amount) |
+------+--------------------+
| 太郎   | 50                 |
| 次郎   | 150                |
| 三郎   | 150                |
+------+--------------------+

INNER JOIN テーブル名で結合したいテーブルを指定します。

この時、各カラムがどちらのテーブルのカラムを使うかを指定する為に、テーブル名.カラム名で指定します。


INNER JOINの次のON句で各テーブル間でどのカラムを関連付けるかを指定します。


INNER JOINによる複数のテーブルの結合を内部結合と呼びます。

SQLite INNER JOIN with Examples

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

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