TOP

SQL レッスン 9. サブクエリ

これまでは、単純なクエリと 1 つの SELECT ステートメントを使用してデータベースからデータを取得してきました。ただし、やはり、多くの条件を満たすデータを選択する必要があることが多くなり、ここでは高度なクエリなしでは実行できません。このため、SQL にはサブクエリまたはネストされたクエリがあり、1 つの SELECT ステートメントが別の SELECT ステートメントの中にネストされています。

サブクエリは、別の SELECT、SELECT...INTO、INSERT...INTO、DELETE、UPDATE 内、または別のサブクエリ内にネストされた SELECT ステートメントです。

サブクエリのテキストは括弧で囲む必要があります。サブクエリは、テーブルを結合する (JOIN) の代わりによく使用されます。


1. サブクエリを使用したフィルタリング

DBMS Access で使用されるデータベース テーブルはリレーショナル テーブルです。つまり、すべてのテーブルは共通フィールドによって相互にリンクできます。データを 2 つの異なるテーブルに保存し、一方のテーブルのデータを、もう一方のテーブルに含まれるデータに応じて選択する必要があるとします。このために、データベースに別のテーブルを作成します。これは、たとえば、サプライヤーに関する情報を含むテーブル Sellers になります。

これで、同じフィールド City を持つ 2 つのテーブル Sumproduct と Sellers ができました。カナダだけで販売された製品の数を数える必要があるとします。サブクエリはこれを行うのに役立ちます。そこで、まず、カナダにある都市のサンプルに対するクエリを作成してみましょう。

Run SQLSELECT City 
FROM Sellers 
WHERE Country = 'Canada'

次に、このデータを次のクエリに渡して、Sumproduct テーブルからデータを選択します。

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN ('Montreal','Toronto')

これら 2 つのリクエストを 1 つに結合することもできます。したがって、データを出力する 1 つのリクエストが主リクエストとなり、入力データを転送する 2 つ目のリクエストは補助 (サブクエリ) になります。サブクエリを挿入するには、WHERE ... IN (...) という構造を使用します。これについては、セクション 高度なフィルタリング で説明しています。

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN (SELECT City 
               FROM Sellers 
               WHERE Country = 'Canada')

2 つの別個のクエリと同じデータが得られたことがわかります。同様に、サブクエリを必要なだけネストすることで、クエリのネストの深さを増やすことができます。

2. 決済フィールドとしてのサブクエリの使用

サブクエリを計算フィールドとして使用することもできます。たとえば、次のクエリを使用して各販売者の販売製品数を表示してみましょう。

Run SQLSELECT Seller_name, (SELECT SUM(Quantity) 
                     FROM Sumproduct 
                     WHERE Sellers.City = Sumproduct.City) AS Qty 
FROM Sellers

最初のステートメント SELECT には、Seller_name と Qty という 2 つの列が表示されます。フィールド Qty は計算され、サブクエリの実行の結果として形成され、丸括弧で囲まれます。このサブクエリは、Seller_name フィールドのレコードごとに 1 回実行され、4 つの販売者名が選択されているため、合計 4 回実行されます。

また、サブクエリでは、WHERE 句が結合関数を実行します。これは、WHERE を使用して、列 (Table.Field) の完全な名前を使用して City フィールドによって 2 つのテーブルを結合したためです。