今回は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