LoginSignup
0
1

More than 3 years have passed since last update.

サブクエリについておさらい

Posted at

最近、サブクエリを書く場面がありました。SQLをスラスラ使いこなすまでにまだまだ道のりは長そうですが、今回はサブクエリについてまとめました。

SELECT文で値を取得する時、テーブルを加工した上(GROUP BY等)で取得したい場合があるでしょう。

そういったケースでかつ、VIEWとして使い回す必要が無いのであれば、サブクエリを使います。

サブクエリとは?

  • サブクエリは情報を取得する為に、一時的なテーブル(使い捨てのVIEW)を生成する。
  • 実行終了後に生成された一時的なテーブルは破棄される

構文

サブクエリは入れ子構造になっています。

一時テーブルを生成するSELECT文は()で囲みASでサブクエリ名を付けます。

まず、FROM句の中に書いたSELECT文が実行され、その後に、生成されたサブクエリを元に外側のSELECT文が実行されます。

※入れ子の階層はどこまでも深くする事は原則的には可能ですが、深くなればなるほど、読みづらく、パフォーマンスにも影響を与えます。

サブクエリの構文
SELECT "カラム名"
FROM 
   (
     SELECT "サブカラム名"
     FROM "サブテーブル名"
   ) AS "サブクエリ名"

実際に書いてみる

サブクエリを使って、以下のようなレコードのコレクションからジャンル毎の所持レコードの枚数を集計してみましょう。
スクリーンショット 2019-08-31 13.49.40.png

ジャンル毎の枚数を集計するSQL
SELECT genre, cnt_genre
FROM (SELECT genre, COUNT(*) AS cnt_genre
        FROM Music
        GROUP BY genre
     ) AS GenreSum

()の中で、GROUP BYでジャンル毎の枚数をCOUNT関数で取得してASでGenreSumというサブクエリ名を付けています。

()内で生成された一時的なテーブルを使って外側のSELECT文が実行されます。

実行した結果

ちゃんとジャンル毎の枚数が取れていますね。
スクリーンショット 2019-08-31 13.31.28.png

上記のようなケースでは、サブクエリを書かなくも値の取得は可能ですが、例として単純化してまとめてみました。

サブクエリを使えば、複雑な処理を行うSQLを書く事が出来ます。パズルのようで、落ち着いて組み立てる必要がありますが、サブクエリ一つ一つを部品として考えれば、組み立てる事が出来るようになると思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1