SELECT文(サブクエリ)

サブクエリとは

SQLにはさらに複雑な問い合わせ方法があります。
問い合わせの中に問い合わせを埋め込むことができ、 これを副問い合わせ(サブクエリ)といいます。

「商品」表

商品コード商品名単価
101メロン800
102いちご150
103りんご120
104レモン200

「売上明細」表

報告書コード商品コード個数
11011011100
1101102300
11021031700
1103104500
11041012500
11051032000
1105104700

この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」が求められます。
求めた結果は外側ののクエリの条件として使います。
そしてこのの処理を、の各行について行うわけです。

↓取得結果

報告書コード商品コード個数
11041012500
11051032000
1105104700

反対に、上記を相関サブクエリを使わずにあえて冗長に書いてみましょう。
SELECT * FROM 売上明細 WHERE 商品コード = 101 AND 個数 > (SELECT AVG(個数) FROM 売上明細 WHERE 商品コード = 101);
このSQL文は商品コード「101」の場合のみですので、これを存在する商品コードの数だけ実行することになります。
今回はデータ数が少ないので良いですが、例えば100データでもあったらどうでしょうか?・・・とても大変です。
相関サブクエリの便利さが実感できますね!

練習問題

上記の「商品」表と「売上明細」表を使用し、SQL文を作成してください。

問1: 単価が300以上の果物の売上明細を調べてください。

問2: 商品ごとに平均売上個数を求め、その平均売上個数未満である明細項目を調べてください。

タイトルとURLをコピーしました