最近、サブクエリを書く場面がありました。SQLをスラスラ使いこなすまでにまだまだ道のりは長そうですが、今回はサブクエリについてまとめました。
SELECT文で値を取得する時、テーブルを加工した上(GROUP BY等)で取得したい場合があるでしょう。
そういったケースでかつ、VIEWとして使い回す必要が無いのであれば、サブクエリを使います。
サブクエリとは?
- サブクエリは情報を取得する為に、一時的なテーブル(使い捨てのVIEW)を生成する。
- 実行終了後に生成された一時的なテーブルは破棄される
構文
サブクエリは入れ子構造になっています。
一時テーブルを生成するSELECT文は()
で囲みAS
でサブクエリ名を付けます。
まず、FROM句の中に書いたSELECT文が実行され、その後に、生成されたサブクエリを元に外側のSELECT文が実行されます。
※入れ子の階層はどこまでも深くする事は原則的には可能ですが、深くなればなるほど、読みづらく、パフォーマンスにも影響を与えます。
SELECT "カラム名"
FROM
(
SELECT "サブカラム名"
FROM "サブテーブル名"
) AS "サブクエリ名"
実際に書いてみる
サブクエリを使って、以下のようなレコードのコレクションからジャンル毎の所持レコードの枚数を集計してみましょう。
SELECT genre, cnt_genre
FROM (SELECT genre, COUNT(*) AS cnt_genre
FROM Music
GROUP BY genre
) AS GenreSum
① ()
の中で、GROUP BYでジャンル毎の枚数をCOUNT関数で取得してAS
でGenreSumというサブクエリ名を付けています。
②()
内で生成された一時的なテーブルを使って外側のSELECT文が実行されます。
実行した結果
上記のようなケースでは、サブクエリを書かなくも値の取得は可能ですが、例として単純化してまとめてみました。
サブクエリを使えば、複雑な処理を行うSQLを書く事が出来ます。パズルのようで、落ち着いて組み立てる必要がありますが、サブクエリ一つ一つを部品として考えれば、組み立てる事が出来るようになると思います。