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

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

目次

相関副問合せとは

1   select *  from  テーブルA
2   where 項目 > (select 項目 from テーブルB where テーブルA.項目 = テーブルB.項目)
  • 1行目のfromにあるテーブルは「テーブルA」です。
  • 2行目の副問合せのfromにあるテーブルは「テーブルB」です。
    →副問合せのwhereの条件に「テーブルAの項目」があります。
     →2行目のfromにあるテーブルではない列を条件にしています。
      →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 as a
where kosuu =
 (select max(kosuu)from syouhin as b where a.category = b.category);

3行目のwhereの条件で、主問い合わせのa.categoryを条件にしているので相関副問合せになります。1行目を実行し、その結果として4行取得します。

その取得した行の1行目のcategoryの値「フルーツ」を3行目の条件とします。categoryはselectの項目にありませんが可能です。

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

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

結果

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

id name
2 みかん
4 大根

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

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

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

テストデータ

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

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

SQL文

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

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

2行目は、EXISTS句があります。条件に一致した場合に結果が表示されます。
3行目のwhereの条件で、主問い合わせのa.idを条件にしているので相関副問合せになります。
1行目を実行し、その結果として複数行取得します。

その取得した行の1行目のidの値「2」を3行目の条件とします。idはselectの項目にありませんが可能です。

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

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

結果

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

name
大根

関連の記事

SQL 内部結合のサンプル(inner join)
SQL 外部結合のサンプル(left outer join/right outer join)
SQL 副問合せのサンプル(サブクエリ)
SQL 自己結合のサンプル
SQL UNIONとUNION ALLのサンプル

△上に戻る