連載
» 2007年08月29日 00時00分 公開

SELECT文の総仕上げはサブクエリさらっと覚えるSQL&T-SQL入門(7)(2/2 ページ)

[石橋潤一,株式会社システムインテグレータ]
前のページへ 1|2       

サブクエリのさまざまな場所での利用

 ここまで取り上げたサブクエリはWHERE句で利用してきましたが、サブクエリはWHERE句だけでなくさまざまな場所でも利用可能です。ここでは、代表的な利用方法であるSELECT句とFROM句での利用を取り上げます。

SELECT句でのサブクエリの利用

 WHERE句でサブクエリを利用する場合、サブクエリの結果を取得することはできず、WHERE句にて条件式として利用するだけでした。一方、SELECT句でサブクエリを利用する場合、メインクエリの結果としてサブクエリの結果を取得できます。具体的な例を見てみましょう。

SELECT CustomerID,COUNT(*) AS Cnt_Cust,
 (SELECT COUNT(*) FROM Sales.SalesOrderHeader) AS Cnt_All
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
 
結果
CustomerID      Cnt_Cust          Cnt_All
-----------------------------------------
1                      4            31465
2                      8            31465
3                     12            31465
…中略…
29483                  1            31465

 この例では、顧客ごとの受注件数と全体の受注件数の差異を確認できます。単一のSELECT文で、グループ化された結果と全体の結果を同時に得ることはできませんが、サブクエリを組み合わせることで、このような性格の異なる値を同時に取得することが可能です。

 また、SELECT句で利用するサブクエリでは、メインクエリから列値を渡すことによって、関数のような動きをさせることが可能です。次の例ではメインクエリから受注番号を受け取り、その明細行数を結果として出力しています。

SELECT SOH.SalesOrderID,
 (SELECT COUNT(*) FROM Sales.SalesOrderDetail AS SOD
  WHERE SOD.SalesOrderID = SOH.SalesOrderID
 ) AS Cnt_Detail
FROM Sales.SalesOrderHeader SOH
 
結果
SalesOrderID     Cnt_Detail
---------------------------
43659                    12
43660                     2
43661                    15
…中略…
75123                     3

FROM句でのサブクエリの利用

 FROM句でのサブクエリの利用は、これまでのサブクエリと性格が異なります。WHERE句、SELECT句でのサブクエリはあくまで結果として値を利用していました。これがFROM句での利用では、サブクエリの結果を1つのテーブルとして扱うことが可能となります。FROM句でのサブクエリの利用は非常に応用性が高く、サブクエリの主だった利用目的はこのFROM句での利用にあるといえるほどです。それでは、早速サンプルを見てみましょう。

SELECT AVG(Cnt_Detail) AS AVG_Detail
FROM
 (SELECT COUNT(*) AS Cnt_Detail
  FROM Sales.SalesOrderDetail
  GROUP BY SalesOrderID
  ) AS SOD
 
結果
AVG_Detail
----------
3

 まず、FROM句で指定したサブクエリでは、受注明細テーブルから受注ごとの明細件数を計算し、これを1つのテーブルとして返しています。

 さらに、このテーブルから取り出した値から平均受注明細数を求めています。これまで取り上げてきたSQLでは集計関数を組み合わせた計算は不可能でしたが、サブクエリを使うことによって可能となりました。

 このように、サブクエリをFROM句にて指定することで結果をあたかも1つのテーブルとして扱うことが可能であり、多様な表現を簡単に行うことができます。

まとめ

 今回はSELECT文に関する記事としては最終回ということで、サブクエリを取り上げました。これまでWHERE句による絞り込みやGROUP BYによるグループ化、関数の利用、テーブルの結合など、さまざまな構文を取り上げてきましたが、サブクエリは最後に取り上げるのにふさわしい応用的な内容となっています。その利用範囲は非常に広く、これまでの構文では不可能だった柔軟な表現が可能です。サンプルデータベースを利用して、サブクエリの動きや応用、テーブル結合との組み合わせなど、その動作を確認しておきましょう。


 次回はデータの登録・更新・削除を行う、INSERT、UPDATE、DELETE文を取り上げます。お楽しみに!(次回へ続く)

筆者プロフィール

石橋潤一
株式会社システムインテグレータ勤務。Web+DBの業務アプリをメインに開発に携わる。@IT連載記事「SQL Server 2005を使いこなそう」「SQL Server 2005 CTPレビュー」執筆のほか、著書に『DBマガジン別冊 SQL Server 2005徹底活用ガイド』(翔泳社刊/共著)、『ASP.NET+SQL Server ゼロからはじめるWebアプリケーション』(ソフトバンクパブリッシング刊/共著)。



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。