サブクエリとは
SQLにはさらに複雑な問い合わせ方法があります。
問い合わせの中に問い合わせを埋め込むことができ、 これを副問い合わせ(サブクエリ)といいます。
「商品」表
| 商品コード | 商品名 | 単価 |
|---|---|---|
| 101 | メロン | 800 |
| 102 | いちご | 150 |
| 103 | りんご | 120 |
| 104 | レモン | 200 |
「売上明細」表
| 報告書コード | 商品コード | 個数 |
|---|---|---|
| 1101 | 101 | 1100 |
| 1101 | 102 | 300 |
| 1102 | 103 | 1700 |
| 1103 | 104 | 500 |
| 1104 | 101 | 2500 |
| 1105 | 103 | 2000 |
| 1105 | 104 | 700 |
この2つの表を使って、「個数が1000個以上の商品名」を検索することができます。
SELECT * FROM 商品 WHERE 商品コード IN ( SELECT 商品コード FROM 売上明細 WHERE 個数 >= 1000 ) ;
このSQL文では、まず ( ) 内のSELECT文が検索され、「売上明細」表の商品コード「101」「103」が結果として得られます。
そしてこの ( ) 内の結果が ( ) 外のSELECT文の条件の一部となります。そのため、商品コード「101」「103」に該当する商品名が検索されます。
↓取得結果
| 商品コード | 商品名 | 単価 |
|---|---|---|
| 101 | メロン | 800 |
| 103 | りんご | 120 |
つまり、サブクエリでは ( ) 内のSELECT文の結果が、( ) 外のSELECT文に渡されて検索されるのです。
上記のように、他のSQL文の中にネスト構造で含まれるSELECT文のことをサブクエリというのです。
相関サブクエリ
サブクエリ内では、サブクエリ外で指定された表に別名を与え、内側で使うことがあります。
これを相関副問い合わせ(相関サブクエリ)といいます。
次のSQL文では、「売上明細表の商品ごとに平均売上個数を求め、その平均売上個数よりも多く売り上げた明細項目」を抽出します。

ここでは「売上明細」表の別名を「U」としています。
順を追って見ると、まず「U」という別名を与えた売上明細の1行目を内側のクエリに渡して、商品コードが同じ行を抽出します。
例えば商品コード「101」の場合、②ではその平均売上個数「1800」が求められます。
求めた結果は外側の③のクエリの条件として使います。
そしてこの②・③の処理を、①の各行について行うわけです。
↓取得結果
| 報告書コード | 商品コード | 個数 |
|---|---|---|
| 1104 | 101 | 2500 |
| 1105 | 103 | 2000 |
| 1105 | 104 | 700 |
反対に、上記を相関サブクエリを使わずにあえて冗長に書いてみましょう。
SELECT * FROM 売上明細 WHERE 商品コード = 101 AND 個数 > (SELECT AVG(個数) FROM 売上明細 WHERE 商品コード = 101);
このSQL文は商品コード「101」の場合のみですので、これを存在する商品コードの数だけ実行することになります。
今回はデータ数が少ないので良いですが、例えば100データでもあったらどうでしょうか?・・・とても大変です。
相関サブクエリの便利さが実感できますね!
練習問題
上記の「商品」表と「売上明細」表を使用し、SQL文を作成してください。
問1: 単価が300以上の果物の売上明細を調べてください。
問2: 商品ごとに平均売上個数を求め、その平均売上個数未満である明細項目を調べてください。
