SQLの相関副問合せのサンプルです。
目次
相関副問合せとは
| select 項目 from テーブル名A where 項目 > (select 項目 from テーブルB where テーブルA.項目 = テーブルB.項目) |
- 上記は相関副問合せの一例です。下段が副問合せです。
- 副問い合わせのSQLのwhereの条件に「副問合せのfromにないテーブルの列」を条件にしているSQL文です。
- 相関副問合せは、主問い合わせのSQLを実行してから副問合せのSQLが実行されます。
- (副問合せのみの場合は、副問合せのSQLを実行して主問い合わせのSQLが実行されます)
- 相関サブクエリとも呼ばれます。
- SQL 副問合せのサンプル(サブクエリ)
自己結合での相関副問合せのサンプル
自己結合での相関副問合せのサンプルです。
テストデータ
以下のテーブルがあるとします。
| 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句で相関副問合せのサンプルです。
テストデータ
以下のテーブルがあるとします。
| id | name | category | kosuu |
|---|---|---|---|
| 1 | りんご | フルーツ | 20 |
| 2 | ばなな | フルーツ | 40 |
| 3 | みかん | フルーツ | 50 |
| 4 | いちご | フルーツ | 50 |
| 5 | にんじん | 野菜 | 15 |
| 6 | 大根 | 野菜 | 20 |
| 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のサンプル