7.2 サブクエリの発展

ここからは、サブクエリの発展的な使い方を説明します。

7.2.1 「FROM」句でのサブクエリ

前節では「WHERE」句の条件としてサブクエリを使用しましたが、サブクエリは「WHERE」句だけで使われるわけではありません。まず「FROM」句での使用例から見ていきます。「FROM」句でサブクエリを使用する場合の書式は下記のようになります。

   SELECT 列名 FROM サブクエリ

例えば「bookinfo」と「orderinfo」を結合して注文金額を算出し、ユーザーごとの受注金額を集計した後にその受注金額の最大値を取得するケースを考えてみましょう。受注金額の集計までは、これまで学習したDML文で取得することができます。

SELECT B.user,SUM(A.price*B.quantity)
FROM bookinfo A INNER JOIN orderinfo B ON A.isbn=B.isbn
GROUP BY B.user;

この集計した値を元に最大の注文金額を取得するには、先に示したDML文をサブクエリとして「FROM」句に入れ、テーブルと見做すことで実現できます。DML文は下記のようになります。

SELECT MAX(C.amount) FROM
(SELECT B.user,SUM(A.price*B.quantity) AS amount
FROM bookinfo A INNER JOIN orderinfo B ON A.isbn=B.isbn
GROUP BY B.user
) C;

7.2.2 「SELECT」句でのサブクエリ

次に「SELECT」句でのサブクエリの使用方法について見てみましょう。書式は下記のようになります。

   SELECT サブクエリ FROM テーブル名;

「orderinfo」でユーザー毎の受注数量と全体の受注数量を対比して見たい場合などは下記のようなサブクエリで取得することができます。

   SELECT user,SUM(quantity),(SELECT SUM(quantity) FROM orderinfo) FROM orderinfo GROUP BY user;

7.2.3 「HAVING」句でのサブクエリ

「HAVING」句でもサブクエリが使えます。書式は下記のようになります。

SELECT グループ化キー,集計関数(列名) FROM テーブル名 GROUP BY グループ化キー
HAVING 集計関数(列名) 演算子 サブクエリ;

「orderinfo」でユーザー毎の受注数量と全体の受注数量を対比して見たい場合などは下記のようなサブクエリで取得することができます。「orderinfo」で、注文数が平均注文数を下回っているユーザーを取得したい場合などは、下記のようなDML文で取得可能です。

SELECT user,SUM(quantity) FROM orderinfo GROUP BY user
HAVING SUM(quantity) < (SELECT AVG(quantity) FROM orderinfo);