🙄

【SQL】SELECT文のFROM句に副問い合わせを記述すると

に公開

はじめに

『スッキリわかるSQL入門 第2版』の第7章「副問い合わせ」の問題7-1を解いた時、一瞬理解できない言葉があったので、Geminiに質問した内容を、以下メモとしてまとめました。
なお、解説については、Geminiの解説より一部引用しています。

対象の文章

SQLのSELECT文のFROM句に副問い合わせを記述することで、別テーブルを検索した結果である表形式をあたかもテーブルのように指定するもの...
※『スッキリわかるSQL入門 第2版』の第7章「副問い合わせ」の問題7-1 より一部引用

意味

FROM句に副問い合わせを記述するとは、一時的な仮想テーブルを作成して、その仮想テーブルに対してさらにクエリを実行することです。この副問い合わせのことをインラインビューと呼びます。

なぜFROM句に副問い合わせを使うのか

通常のSELECT文
FROM句には既存のテーブル名を指定します。
しかし、複雑な分析を行う際には、複数のテーブルを結合したり、集計したりした「中間的な結果」に対してさらに条件をつけたり、結合したりしたい場合があります。

FROM句に副問い合わせを使う
この「中間的な結果」を一時的なテーブルとして扱い、その一時的なテーブルに対して、あたかも実在するテーブルであるかのようにSELECT文を実行できます。

つまり、通常のSELECT文におけるFROM句の使い方では、目的を達成できない場合に、副問い合わせを使用して対応するということです。

具体的な例

「各部署の平均給与」を求めた後、その平均給与が全体の平均給与より高い部署だけを抽出したいとします。

  • 通常のクエリだけでは難しい
  • AVG()関数はWHERE句で直接使うことができない
SELECT
  department_id,
  avg_salary
FROM
  (SELECT
     department_id,
     AVG(salary) AS avg_salary 
   FROM
     employees
   GROUP BY
     department_id) AS dept_avg_salaries -- 仮想テーブル
WHERE
  avg_salary > (SELECT AVG(salary) FROM employees);
  1. FROM句の後に記述されているカッコ内の副問い合わせが実行されます
  2. この一時的な結果に dept_avg_salaries という別名(エイリアス)が付けられます
  3. dept_avg_salaries という仮想テーブルに対して、外側のSELECT文が実行されます
  4. WHERE句では、仮想テーブルの avg_salary 列が、employeesテーブル全体の平均給与より大きいかどうかを判定します。

このように、FROM句の副問い合わせは、複雑な問題をより単純なステップに分解して解決するための強力な手段となります。
このクエリでは、実在するテーブルではなく、一時的に作成された仮想テーブルを対象にしています。 WHERE句は、その仮想テーブルの行を絞り込むために使われているということです。

まとめ

この記事(メモ)では、FROM句で副問い合わせを使った場合の挙動と意味について調べた結果をまとめました。副問い合わせは記述が多く、初めはどこから処理するのかがわかりづらいと感じます。
継続して使ってみることで相場を掴めるようになってくると思うので、今何の処理をしているのかを順番に追っていきながら使っていきます。

最後までお読みいただき、ありがとうございました。

参考文献

『スッキリわかるSQL入門 第2版』

Discussion