SQL 相関副問合せのサンプル(相関サブクエリ)

SQLの相関副問合せのサンプルです。

目次

説明 相関副問合せとは
サンプル 自己結合で相関副問合せのサンプル
  EXISTS句で相関副問合せのサンプル

相関副問合せとは

1   select *  from  テーブルA
2   where 項目 > (select 項目 from テーブルB where テーブルA.項目 = テーブルB.項目)
  • 1行目の主問い合わせにあるテーブルは「テーブルA」です。
  • 2行目の副問合せにあるテーブルは「テーブルB」です。
    →2行目の副問合せのwhereの条件に1行目の主問い合わせの「テーブルAの項目」があります。
     →副問合せの中に主問い合わせの項目があります。
      →SQLは相関副問合せです。
  • 相関副問合せは、主問い合わせのSQLを実行し、そこで取得した行を1行ずつ副問合せの条件にセットしてSQLを実行します。
  • 副問合せのみの場合は、副問合せのSQLを実行してから主問い合わせのSQLを実行します。
  • 相関サブクエリとも呼ばれます。
  • SQL 副問合せのサンプル(サブクエリ)

自己結合での相関副問合せのサンプル

自己結合での相関副問合せのサンプルです。

以下のテーブルがあるとします。

syouhinテーブル
id name category kosuu
1 りんご フルーツ 10
2 みかん フルーツ 20
3 にんじん 野菜 30
4 大根 野菜 40

以下のSQLを実行します。

各カテゴリごとで最も個数の多い商品の名前を表示します。

select id,name from syouhin a
where kosuu =
 (select max(kosuu)from syouhin b where a.category = b.category);

3行目のwhereの条件で、主問い合わせのa.categoryを条件にしているので相関副問合せになります。

1.1行目を実行し、その結果として4行取得します。
2.その取得した行の1行目のcategoryの値「フルーツ」を3行目の条件とします。
a.categoryのaは、副問合せの中にありませんが可能です。

以下は、SQLの実行イメージです。

select id,name from syouhin a
where kosuu =
 (select max(kosuu)from syouhin b where フルーツ = b.category);

条件はカテゴリがフルーツで、個数が最大値のものが条件です。
次もカテゴリがフルーツで、個数が最大値のものが条件です。
次はカテゴリが野菜で、個数が最大値のものが条件です。
次もカテゴリが野菜で、個数が最大値のものが条件です。

結果は、以下のとおりです。

id name
2 みかん
4 大根

フルーツで個数が最大のものと野菜で個数が最大のものを取得しました。

EXISTS句で相関副問合せのサンプル

EXISTS句で相関副問合せのサンプルです。

以下のテーブルがあるとします。

1つめはsalesテーブルです。

salesテーブル
id name
2 みかん
4 大根

2つめはsyouhinテーブルです。

syouhinテーブル
id name category kosuu
1 りんご フルーツ 10
2 みかん フルーツ 20
3 にんじん 野菜 30
4 大根 野菜 40

salesテーブルに存在し、syouhinテーブルでの個数が30以上の商品の名前を表示します。

select name from sales a
    where exists (select 1 from syouhin b
        where b.kosuu > 30 and a.id = b.id);

3行目のwhereの条件で、主問い合わせのa.idを条件にしているので相関副問合せになります。
1行目を実行し、その結果として複数行取得します。
2行目は、EXISTS句があります。条件に一致した場合に結果が表示されます。
2行目のselectの後の項目は使用されません。任意の値を設定できます。1はよく使われます。

以下は、SQLの実行イメージです。

select name from sales a
    where exists (select 1 from syouhin b
        where b.kosuu > 30 and 2 = b.id);

条件はidが2で、個数が30以上のものが条件です。
次はidが4で、個数が30以上のものが条件です。

結果は、以下のとおりです。

name
大根

関連の記事

SQL INNER JOIN 内部結合のサンプル
SQL LEFT OUTER JOIN 外部結合のサンプル
SQL 副問合せのサンプル(サブクエリ)
SQL 自己結合のサンプル
SQL UNIONとUNION ALLのサンプル(結合して抽出)

△上に戻る