SQL入門
サブクエリ(副問合せ)

SQLの初心者向け入門解説、VBAからデータベースを扱うためのSQLを解説
公開日:2019-12-14 最終更新日:2019-12-17

サブクエリ(副問合せ)


エクセルVBAでデータベースを扱うためのSQL入門です。
前回までで、基本的な部分については一通り説明しました。


今回は、より便利にSQLを使えるように副問合せ(サブクエリ)を解説します。
サブクエリが使えるようになると、SQLのすごさがより実感として分かってくるはずです。

すでに、他のテーブルのデータで追加/更新/削除、このなかでサブクエリを紹介しましたが、


・新規テーブルを追加 ・他のテーブルを基にデータを追加 ・他のテーブルを基にデータを更新 ・他のテーブルを基にデータを削除 ・他のテーブルを基にデータを追加/更新/削除の最後に
SELECT部分はサブクエリ(副問合せ)と呼ばれるものになります。
サブクエリについては、次回以降で詳しく解説します。

このように記載していました。
サブクエリについて、基本的な使い方を説明していきます。


使用するテーブル定義は以下になります。

全テーブル定義とテーブル自動作成VBA
・テーブル:m_customer ・テーブル:m_item ・テーブル:t_sales ・テーブル自動作成

サブクエリ(副問合せ)とは

まずクエリとは、「問い合わせ」の意味の英単語です。
データベースに対する問い合わせ言語としてSQLがあります。
つまり、クエリと言ったら、データベースではSQLの事になります。

サブクエリとは、クエリの中の一つの要素として、さらにクエリを入れたものです。
クエリを入れ子(ネスト)しての使い方になります。
SELECT、INSERT、UPDATE、DELETEの各命令の中の子要素として、SELECT命令を入れた書き方になります。
サブクエリの中にさらにサブクエリを入れられます、つまり、多段階のネストができます。

SELECTの結果は、複数のカラム(名前とデータ型)を持つ複数行のデータです。
これは、1つのテーブルと同じとみなすことができます。
複数のSELECT結果を統合(UNION,UNION ALL)
・集合演算:データの統合方法 ・SQLの集合演算について ・和集合:UNION ・全体集合:UNION ALL ・複数のSELECT結果を統合の最後に

SELECTの結果を1つのテーブルとしてSQLの中で使う事がサブクエリの基本的な使い方になります。
また、サブクエリの結果はデータリストとして使う事もできます。

FROM句でサブクエリを使う

SELECTのFROM句に1つのテーブルとしてサブクエリを使います。
SELECTとして実行できるものは、それを()括弧で囲う事で、1つのテーブルとして扱う事が出来ます。

codeごとの合計数を、SELECTの選択カラムとして追加します。

SELECT T.code,T.sales_date,T.item_count,TT.sum_count
  FROM t_sales T
  LEFT JOIN (SELECT code,SUM(item_count) AS sum_count
               FROM t_sales
               GROUP BY code) TT
  ON T.code = TT.code
一見すると難しそうに見えますが、サブクエリを1つのテーブルとしてみると単純なSQLになります。

SELECT T.code,T.sales_date,T.item_count
,TT.sum_count
 FROM t_sales T
 LEFT JOIN 
 (サブクエリ) TT
 ON T.code = TT.code
サブクエリを作成する場合は、単独のSELECTとして動作するかを先に確認すると良いでしょう。

SELECT code,SUM(item_count) AS sum_count
  FROM t_sales
  GROUP BY code
上記2つのSQLを合体させれば目的のサブクエリを組み込んだSQLが完成します。

WHERE句でサブクエリを使う

SELECTのWHERE句の1つの条件としてサブクエリを使います。
1カラムだけのSELECTの結果は、データリストとしてWHERE句の条件として使えます。

m_customerのaddressが「東京~」をt_salesから抽出します。
SELECT code,sales_date,item_count
 FROM t_sales T
 WHERE code IN (SELECT code FROM m_customer
                 WHERE address LIKE '東京%')
サブクエリで取得されるデータは、codeのリストになります。
このcodeのリストをINの中に指定しています。
これは、サブクエリを使わずにJOINで書くことができます。

SELECT T.code,T.sales_date,T.item_count
  FROM t_sales T
  INNER JOIN m_customer M
  ON T.code = M.code
 WHERE M.address LIKE '東京%'
WHERE句にあるサブクエリは、その多くはJOINで書き直すことができます。
WHERE句にサブクエリを追加しようと思ったときは、まずJOINで出来ないか良く検討してみると良いでしょう。

ただし、複数のテーブルを既にJOINしているSQLに、
後からさらに絞り込み条件を追加するような場合は、局所的な修正で済みとても便利な場合があります。

SELECTのカラムにサブクエリを使う

SELECTの列リストの1つとしてサブクエリを使います。
1カラムだけのSELECTの結果は、SELECTの選択列(カラム)として使用できます。

item_countの全合計を1つの列として追加します。

SELECT code,sales_date,item_count
 ,(SELECT SUM(item_count) AS sum_count FROM t_sales)
  FROM t_sales T
このサブクエリは汎用性がなく融通の利かないSQLと言えます。
これは、サブクエリを使わずにJOINで書くことができます。

SELECT T.code,T.sales_date,T.item_count,TT.sum_count
  FROM t_sales T
  LEFT JOIN (SELECT code,SUM(item_count) AS sum_count
               FROM t_sales) TT
SELECTの選択リストにあるサブクエリは、その多くはJOINで書き直すことができます。
選択リストにサブクエリを追加しようと思ったときは、JOINで出来ないか良く検討してください。

SELECTの選択リストにサブクエリを使う事は推奨できません。
代替方法が無い場合に限定して使うようにしてください。

UPDATAEでサブクエリを使う

「他のテーブルのデータで追加/更新/削除」で紹介したSQLです。
サブクエリで取得したデータをUPDATEのSET句で使用しています。

UPDATE t_sales_date SET
 item_amount = (SELECT SUM(item_price * item_count) AS item_amount
                 FROM t_sales T
                 WHERE t_sales_date.code = T.code
                   AND t_sales_date.sales_date = T.sales_date
                 GROUP BY code,sales_date)
WHERE code = '001'
サブクエリは1カラム限定、かつ、データ型を一致させるようにしてください。

DELETEでサブクエリを使う

「他のテーブルのデータで追加/更新/削除」で紹介したSQLです。
サブクエリで取得したデータをDELETEのWHERE句で使用しています。

DELETE FROM t_sales_date
 WHERE code || sales_date NOT IN 
      (SELECT code || sales_date
        FROM t_sales
        GROUP BY code,sales_date)
これは、SELECTのWHEREで使う場合と同じ使い方になります。

サブクエリ(副問合せ)の最後に

今回は、サブクエリの基本的な使い方を説明しました。
基本的な使い方として、
FROM句で使って他のテーブルとJOINする書き方と、
WHERE句のINに指定する書き方をマスターしておけば良いでしょう。

次回は、サブクエリを多段階にネストする書き方と、
複雑化したSQLへのコメントの書き方および整形について解説します。



同じテーマ「SQL入門」の記事

データの更新(UPDATE)

・UPDATATEの構文 ・UPDATEの使用例 ・SELECTで取得→シートで編集→UPDATEで更新 ・データの更新(UPDATE)の最後に
データの削除(DELETE)
・DELETEの構文 ・DELETEの使用例 ・SELECTで取得→シートで削除行を指定→DELETEで削除 ・データの削除(DELETE)の最後に
他のテーブルのデータで追加/更新/削除
・新規テーブルを追加 ・他のテーブルを基にデータを追加 ・他のテーブルを基にデータを更新 ・他のテーブルを基にデータを削除 ・他のテーブルを基にデータを追加/更新/削除の最後に
インデックスを作成して高速化(CREATE INDEX)
・インデックスとは ・インデックスを作成 ・UNIQUEインデックスを作成 ・インデックスを削除 ・インデックスを作製の最後に
トランザクション処理
・トランザクション処理とは ・ADOでのトランザクション処理 ・VBAクラスの全コード ・トランザクション処理の使用例 ・トランザクション処理の最後に
VBAクラスの全コード:トランザクション処理
SQL入門の「トランザクション処理」時点のVBAクラスの全コードです。ADOを使ったDB接続のVBAクラスの全コード クラスモジュール:clsSQLite SQLの初心者向け入門解説、VBAからデータベースを扱うためのSQLを解説。
サブクエリ(副問合せ)
サブクエリのネストとSQLコメント&整形
・サブクエリのネスト ・サブクエリのネストの組み方 ・SQLのコメントについて ・SQLの整形 ・サブクエリのネストとSQLコメント&整形の最後に
WITH句(共通テーブル式)
・WITH句の構文 ・WITH句の最も簡単な使用例 ・WITH句に複数のサブクエリを使用する例 ・WITH句を使った再帰SQL ・CASE演算子を使ったマトリックス作成のSQL ・WIYH句(共通テーブル式)の最後に
取得行数を限定するLIMIT句
・LIMIT句の構文 ・LIMIT句の使用例 ・LIMIT句、OFFSET句の最後に
分析関数(OVER句,WINDOW句)
・分析関数とは ・OVER句 ・WINDOW句 ・FILTER句 ・分析関数の使用例 ・分析関数の使用例:グループの最大/最小/平均を明細に出力 ・分析関数の使用例:FILTER句で条件指定 ・分析関数の使用例:明細にレコード番号(連番)を振る ・分析関数の使用例:前回販売日を取得 ・RANK関数,DENSE_RANK関数 ・LAG関数,LEAD関数 ・分析関数の最後に


新着記事NEW ・・・新着記事一覧を見る

ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ