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

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

目次

相関副問合せとは

select 項目  from  テーブル名A
 where 項目 > (select 項目 from テーブルB where テーブルA.項目 = テーブルB.項目)
  • 上記のSQLは相関副問合せです。
    →2行目の副問合せのfromのテーブルは「テーブルB」です。
    →副問合せのwhereの条件に「テーブルAの項目」があります。
    →2行目は、whereの条件にfromにないテーブルの列を条件にしています。
  • 相関副問合せは、主問い合わせのSQLを実行してから副問合せのSQLが実行されます。
  • 副問合せのみの場合は、副問合せのSQLを実行して主問い合わせのSQLが実行されます。
  • 相関サブクエリとも呼ばれます。
  • SQL 副問合せのサンプル(サブクエリ)

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

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

テストデータ

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

syouhinテーブル
id name category kosuu
1 りんご フルーツ 20
2 ばなな フルーツ 40
3 みかん フルーツ 50
4 いちご フルーツ 50
5 にんじん 野菜 15
6 大根 野菜 20

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行目を実行し、その結果として複数行取得します。
その取得した行の1行目を3行目の条件で比較します。
次にその取得した行の2行目を3行目の条件で比較するというように続けていきます。

結果

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

id name
3 みかん
4 いちご
6 大根

 

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

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

テストデータ

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

syouhinテーブル
id name category kosuu
1 りんご フルーツ 20
2 ばなな フルーツ 40
3 みかん フルーツ 50
4 いちご フルーツ 50
5 にんじん 野菜 15
6 大根 野菜 20
salesテーブル
id name
2 ばなな
4 いちご

SQL文

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

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

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

結果

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

name
いちご

関連の記事

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

△上に戻る