PostgreSQLのSELECT内サブクエリ完全入門!初心者でもわかる書き方と使いどころ
生徒
「サブクエリはWHEREで使うものだと思っていたら、SELECTの中にも書けると聞きました。本当にそんなことができるんですか?」
先生
「できますよ。SELECTの中にサブクエリを書くと、各行ごとに計算した結果を一緒に表示できるんです。」
生徒
「各行ごとに計算するって、ちょっと難しそうです…」
先生
「名簿に“平均との差”を書き足すようなイメージで考えると分かりやすいですよ。」
1. SQLとは何か?
SQLは、データベースと呼ばれる「たくさんの情報を表の形で保存する箱」を操作するための言葉です。データベースは、紙の名簿や表をそのままパソコンの中に入れたものだと考えると理解しやすくなります。PostgreSQLは、そのSQLを使って操作できる代表的なデータベースで、会員管理や売上管理など、身近な場面で広く使われています。
2. SELECT内にサブクエリを書くとは
これまでのサブクエリは、WHERE句で条件を決めるために使うものが中心でした。しかし、PostgreSQLではSELECT句の中にもサブクエリを書くことができます。これは「表示する項目そのものを、別のSQLで計算する」という考え方です。
例えるなら、名簿の横に「クラスの平均点」や「平均との差」を新しい列として書き足すようなものです。元の名簿を変えずに、追加情報を表示できるのが大きな特徴です。
3. サブクエリの基本的な形
SELECT内に書くサブクエリも、基本はカッコで囲みます。注意点として、SELECT内のサブクエリは「1つの値」を返す必要があります。複数行が返るとエラーになるため、平均や合計などの集計関数と一緒に使われることが多いです。
SELECT
name,
age,
(SELECT AVG(age) FROM users) AS average_age
FROM users;
このSQLでは、サブクエリで平均年齢を計算し、その結果を全員分の行に表示しています。
4. テーブル例で仕組みを理解する
次のようなusersテーブルがあるとします。まずはSQL実行前のデータです。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋美咲 | 22 | misaki@example.com
5 | 田中健一 | 40 | ken@example.com
この表に「全体の平均年齢」を一緒に表示してみます。
SELECT
name,
age,
(SELECT AVG(age) FROM users) AS average_age
FROM users;
name | age | average_age
-----------+-----+-------------
山田太郎 | 25 | 27.2
佐藤花子 | 19 | 27.2
鈴木一郎 | 30 | 27.2
高橋美咲 | 22 | 27.2
田中健一 | 40 | 27.2
サブクエリは一度だけ平均を計算し、その結果がすべての行に表示されています。
5. 各行と関係するサブクエリ
SELECT内のサブクエリは、外側の行の値を使うこともできます。これを使うと、「その人の年齢が平均より高いか低いか」といった比較結果を表示できます。
SELECT
name,
age,
age - (SELECT AVG(age) FROM users) AS diff_from_average
FROM users;
この例では、平均年齢との差を計算しています。プラスなら平均より年上、マイナスなら年下だと一目で分かります。
6. SELECT内サブクエリを使う場面
SELECT内にサブクエリを書く方法は、一覧表に「補足情報」を付けたいときに便利です。別の表を結合しなくても、ちょっとした計算結果や全体の数値を表示できます。初心者のうちは、まず「全体の平均」「合計」「件数」を一緒に表示する使い方を覚えると理解が深まります。
難しく感じたときは、「この列はどうやって計算しているのか」を紙に書き出し、先に計算する部分がサブクエリだと考えると整理しやすくなります。
7. PostgreSQLで安心して使うためのポイント
PostgreSQLではSELECT内サブクエリがしっかりサポートされていますが、サブクエリが返す値は一つだけという点が重要です。また、書きすぎるとSQLが読みにくくなることもあります。まずは基本の形を理解し、何を表示したいのかをはっきりさせることが大切です。