相関サブクエリと非相関(普通の)サブクエリの違いをわかりやすく解説!

こんにちは。ゆうせいです。

今回は、SQLの中でもちょっと混乱しやすい「相関サブクエリ」と「非相関サブクエリ(普通のサブクエリ)」の違いについて、やさしく丁寧に説明していきます。

難しそうに見えるかもしれませんが、大丈夫。高校生でも理解できるようにたとえ話を交えながら進めていきますね!


相関サブクエリ vs 非相関サブクエリ:まずは定義から

非相関サブクエリ(普通のサブクエリ)

これは、外側のクエリに依存しないサブクエリのことです。

つまり、サブクエリは独立して実行できるということ。

たとえばこんな感じ:

SELECT name
FROM employees
WHERE department_id = (
    SELECT id
    FROM departments
    WHERE name = '営業部'
);

この例では、「営業部のIDを取得して、それに属する社員を取得する」というシンプルな構造です。内側(サブクエリ)は一度だけ実行されます。


相関サブクエリ(correlated subquery)

一方こちらは、外側のクエリの行に応じてサブクエリが実行されるタイプのサブクエリです。

例を見てみましょう:

SELECT name
FROM employees e
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
    WHERE department_id = e.department_id
);

この例では、「自分の部署の平均給与より高い人」を選んでいます。

注目してほしいのは、サブクエリの中で外側の e.department_id を使っている点です。

つまり、外側のクエリの各行に対して、サブクエリが毎回再評価される、というわけです!


違いを図で表すとこうなります

項目非相関サブクエリ相関サブクエリ
実行回数一度だけ外側のクエリの行数分
外側の値を参照するかしないする
独立性高い(単体で動く)低い(外側が必要)
パフォーマンス良い(条件による)悪くなりやすい(回数が多い)
難易度比較的簡単少し複雑

たとえ話で理解しよう!

想像してみてください。

  • 非相関サブクエリは、「営業部の部屋番号を調べてから、部屋番号が一致する人の名簿を出す」ようなもの。
    • 一度調べた結果を使い回してるんです。
  • 相関サブクエリは、「社員一人ひとりについて、『あなたの部署の平均給与はいくらですか?』と都度調査して比較する」ようなもの。
    • 毎回個別に聞き取り調査しているようなものなので、手間がかかります。

メリットとデメリット

非相関サブクエリのメリット

  • パフォーマンスが高い
  • シンプルで読みやすい

デメリット

  • 複雑な条件分岐が難しい

相関サブクエリのメリット

  • 外側の行に依存した柔軟なロジックが書ける

デメリット

  • 遅くなりやすい
  • 理解が難しくなりがち

実行の流れを数式的に表すと

非相関サブクエリ:

x = サブクエリの結果
y = 外側クエリの条件
→ y を x と比較

相関サブクエリ:

for 各行 r in 外側クエリ:
    x = サブクエリ(r)
    if 条件(x, r):
        出力

このように、「1回 vs 毎回」が大きな違いです。


今後の学習の指針

  • まずは非相関サブクエリをマスターしましょう。これは多くの基本クエリに使えます。
  • 次に、相関サブクエリを実際に書いてみて「遅くなるケース」や「JOINとの比較」を体験してみましょう。
  • 最後に、相関サブクエリが不要な場合はJOINで書き換える練習をしてみると、SQL力がぐっと伸びます!

いつでも練習問題や実例のリクエストも受け付けていますよ!気軽に聞いてくださいね。


セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。