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

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

アプリケーション開発でデータベースを利用する新人プログラマに向けて、SQLおよびT-SQLを短期間で理解できるよう、開発現場ですぐに必要となる内容を中心に解説する。(編集部)

[石橋潤一,株式会社システムインテグレータ]

主な内容

   --Page 1--
▼サブクエリとは
▼複数の結果を返すサブクエリ
   --Page 2--
▼サブクエリのさまざまな場所での利用
▼まとめ


 初回から7回にわたってSELECT文の利用法を取り上げてきましたが、それも今回でとうとう最後となります。今回取り上げるのは、SQL文の中にSELECT句を入れ子にして埋め込む「サブクエリ」です。

サブクエリとは

 サブクエリは「副問い合わせ」とも呼ばれ、SQL文の中にSELECT文を埋め込み、抽出条件として利用することを可能としています。これまで、テーブルからデータを抽出するためにWHERE句による絞り込みやJOIN句による結合を利用してきましたが、サブクエリはその応用といえる存在です。

 では、次のような例を見てみましょう。

SELECT ProductID FROM Production.Product WHERE Name = 'Chain'
 
結果
ProductID
-------------
952

 このSQL文は、特定の名前に対する商品IDを求めている単純な問い合わせです。続いてこの条件をそのままに、商品テーブルと受注明細テーブルを結合させ、特定の商品に対する受注の一覧を調べるSQL文は次のような形になります。

SELECT SalesOrderID FROM Sales.SalesOrderDetail AS SOD
INNER JOIN Production.Product AS Pdt
ON SOD.ProductID = Pdt.ProductID
WHERE Pdt.Name = 'Chain'
 
結果
SalesOrderID
-------------
51083
51084
51090
…中略…
71952

 このようなSQLを発行する場合、サブクエリを利用すれば同じ結果をよりシンプルに得られます。それでは、まずはサブクエリの簡単な構文から見てみましょう。

SELECT 列名 FROM テーブル名

 WHERE 列名 演算子 (サブクエリ)


 WHERE句にて、列に対する条件式としてサブクエリを使用しています。通常、WHERE句に使う条件としては、数値や文字列といった何らかの値を利用しますが、サブクエリを利用することにより、SELECT文の結果を条件として利用できます。

 先ほど取り上げた商品テーブルと商品明細テーブルを結合させたSQL文について、同じ結果をサブクエリで求めてみましょう。

SELECT SalesOrderID FROM Sales.SalesOrderDetail
WHERE ProductID = 
(SELECT ProductID FROM Production.Product
 WHERE Name = 'Chain')
 
結果
SalesOrderID
-------------
51083
51084
51090
…中略…
71952

 WHERE句にて「ProductID」列に対する条件として、冒頭で取り上げた商品マスタに対するSELECT文がサブクエリとして埋め込まれています。このように、サブクエリを利用することにより、SELECT文の結果を利用した抽出を行うことが可能です。

複数の結果を返すサブクエリ

 サブクエリとしてSELECT文を記述する際、単一の結果を返すSELECT文と複数行にわたる結果を返すSELECT文が存在します。単一の結果であれば、先ほど取り上げたようなイコール、大小といった条件式を利用できます。しかし、サブクエリの結果が複数行となる場合はこのような条件式は利用できず、「条件のいずれかと一致する」を意味する「IN」句を利用する必要があります。具体的な例を見てみましょう。

SELECT ProductID FROM Production.Product WHERE ProductModelID = 21
 
結果
ProductID
-------------
785
786
787
788

 このSELECT文は複数の結果を返します。このようなSELECT文をサブクエリとして埋め込む場合、IN句を利用した次のような構成となります。

SELECT SalesOrderID FROM Sales.SalesOrderDetail
WHERE ProductID IN 
(SELECT ProductID FROM Production.Product
 WHERE ProductModelID = 21)
 
結果
SalesOrderID
-------------
46608
46610
46611
…中略…
50756

 サブクエリとして指定したSELECT文は複数の結果を返しますが、そのいずれかに一致するデータが抽出されていることが分かります。JOINを利用した結合でもまったく同じ結果を得られますが、サブクエリを利用した方が構成が分かりやすく記述も容易です。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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