SQLite3でサブクエリを使ってみる

SQLite3で登録されている合計金額が上位5位のユーザー名を調べたいとします。

使用するデータはパイソンでgimeiでSQLite3のRDB用のテストデータを用意してみるで作成したものを使います。

※ sample.sqlite3のパスが/path/to/dir/ledger.sqlite3で話を進めます。


# ledger.sqlite3があるディレクトリまで移動
$ cd /path/to/dir
$ sqlite3 ledger.sqlite3

始めにledgerテーブルの方で、合計金額が上位5位のユーザー(出力はuser_id)まで絞ってみます。

sqlite> SELECT user_id FROM ledger GROUP BY user_id ORDER BY SUM(amount) DESC LIMIT 5;
+---------+
| user_id |
+---------+
| 94      |
| 30      |
| 98      |
| 37      |
| 44      |
+---------+

GROUP BYでユーザーIDで纏めて、ORDER BY句でSUM(amount)の結果で並び替えをすると、合計が上位5位のユーザーまで絞り込むことができます。


この結果を手作業でusersテーブル用の構文を作っても良いですが、この構文自体をサブクエリという書き方でそのまま活用するという手もあります。


サブクエリの一般構文は下記の通りです。

SELECT カラム名 
FROM テーブルA 
WHERE カラム名 演算子 (SELECT カラム名 FROM テーブルB WHERE 条件);

WHERE句内でカッコで囲った箇所で新たに構文を作って実行します。


この例を元に今回のSQLの文を書き換えますと、

sqlite> SELECT * FROM users 
WHERE id IN (
	SELECT user_id FROM ledger 
	GROUP BY user_id 
	ORDER BY SUM(amount) DESC 
	LIMIT 5
);
+----+------+
| id | name |
+----+------+
| 30 | 依奈   |
| 37 | 典男   |
| 44 | 篤人   |
| 94 | 羽琉   |
| 98 | 妙奈   |
+----+------+

になります。


この書き方はアプリケーション開発で良く使います。

SQLite Subquery: An Ultimate Guide for SQLite The Novices

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

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