SQL入門
サブクエリのネストとSQLコメント&整形

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

サブクエリのネストとSQLコメント&整形


エクセルVBAでデータベースを扱うためのSQL入門です。
前回は、サブクエリの基本的な使い方を説明しました。
FROM句で使って他のテーブルとJOINする書き方、WHERE句のINに指定する書き方等々。


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

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

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

サブクエリのネスト

サブクエリの中に、さらにサブクエリを入れられます。
サブクエリのネストです。

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
              WHERE code IN (SELECT code
                             FROM  m_customer
                             WHERE address LIKE '東京%'
                             GROUP BY code)
              GROUP BY code) TT
       ON T.code = TT.code
これは決して実用的なSQLではなく、あくまでサブクエリのサンプルですが、
何をしているかというと、

・addressが東京で始まるcodeを取得 ・・・ IN句の中
・そのcodeのite_countの合計を取得 ・・・ JOIN句の中
・上記item_countの合計をカラム出力 ・・・ 全体
つまり、東京で始ま行にのみ合計数が出力されます。

じっくり見れば分かりますが、
このようなサブクエリの組み方や整形について以下で説明します。

サブクエリのネストの組み方

SQLは順に作成していきます。
まずサブクエリを作成します。

-- サブクエリ1
SELECT code,SUM(item_count) AS sum_count
  FROM t_sales
 WHERE code IN ('001','002') --'001','002'は仮
 GROUP BY code
-- サブクエリ2
SELECT code
  FROM m_customer
  WHERE address LIKE '東京%'
  GROUP BY code
サブクエリそれぞれ単独で動作確認して完成させます。
次にSQL全体を組みます。
SELECT T.code,T.sales_date,T.item_count,TT.sum_count
  FROM t_sales T
  LEFT JOIN (サブクエリ1) TT
       ON T.code = TT.code

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
              WHERE code IN ('001','002') --'001','002'は仮
              GROUP BY code) TT
       ON T.code = TT.code
ここでも動作確認しましょう。
'001','002'をサブクエリ2で置き換えて、

SELECT T.code,T.sales_date,T.item_count,TT.sum_count
  FROM t_sales T
  LEFT JOIN (--↓サブクエリ1
             SELECT code,SUM(item_count) AS sum_count
              FROM t_sales
              WHERE code IN (--↓サブクエリ2
                             SELECT code
                               FROM  m_customer
                               WHERE address LIKE '東京%'
                               GROUP BY code
                             --↑サブクエリ2
                            )
              GROUP BY code
             --↑サブクエリ1
            ) TT
       ON T.code = TT.code
これでひとまず完成です。
出力結果を良く確認して完成されます。

サブクエリは順序良く作成すれば、それほど難しくなく組むことができます。
エクセルのシートでの関数のネストと同じ要領です。
ただし、ネストしすぎたり多くのサブクエリを使用すると、
SQLが複雑となり、後々の修正が大変になってしまいます。

一度正しく動いたものを変更することはとても大変ですし危険も伴いますが、
さらなる変更に対応するために、SQLをリファクタリングすることも必要になる場合もあります。

SQLのコメントについて

SQLの中にコメント(実行では無視される)を記載する方法は2通りあります。
-- コメント
--から行末までがコメントとなり、SQL実行で無視されます。

/* コメント */
/*から*/の間が全てコメントになります。
行の途中だけでもコメントアウトできますし、複数行をまとめてコメントアウトもできます。

SELECT カラム /* コメント */ FROM テーブル
WHERE /* コメント・・・
・・・コメント */
GROUP BY ・・・

SQLの整形

SQLは適宜コメントを入れたり、インデント・改行で見やすくしておくようにしましょう。

上記の最初のSQLと最後のSQLは同じ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 T.code,T.sales_date,T.item_count,TT.sum_count
  FROM t_sales T
  LEFT JOIN (
             サブクエリ
            ) TT
       ON T.code = TT.code

GUIツールを使うと、
SQLが見やすく色分けされたり、サブクエリのネストが視覚化されたりするので、より作成しやすいはずです。

VBA マクロ SQL サブクエリ
※DB Browser for SQLite

まずは、自身が最も見やすいと思う形に整形してみましょう。
また、WEBや書籍で見た時に見やすいと思ったら、それを真似すると良いでしょう。

VBA内に記述する時も、文字列作成時に改行やインデントを考慮しておくと、
文字列をイミディエイトで取得して、DBのGUIツール等に貼り付けた時に見やすくなり、効率が良くなります。

sSql = sSql & "SELECT T.code,T.sales_date,T.item_count,TT.sum_count" & vbCrLf
sSql = sSql & " FROM t_sales T" & vbCrLf
sSql = sSql & " LEFT JOIN (--↓サブクエリ1" & vbCrLf
sSql = sSql & "       SELECT code,SUM(item_count) AS sum_count" & vbCrLf
sSql = sSql & "       FROM t_sales" & vbCrLf
sSql = sSql & "       WHERE code IN (--↓サブクエリ2" & vbCrLf
sSql = sSql & "               SELECT code" & vbCrLf
sSql = sSql & "                FROM m_customer" & vbCrLf
sSql = sSql & "                WHERE address LIKE '東京%'" & vbCrLf
sSql = sSql & "                GROUP BY code" & vbCrLf
sSql = sSql & "               --↑サブクエリ2" & vbCrLf
sSql = sSql & "              )" & vbCrLf
sSql = sSql & "       GROUP BY code" & vbCrLf
sSql = sSql & "       --↑サブクエリ1" & vbCrLf
sSql = sSql & "      ) TT" & vbCrLf
sSql = sSql & "    ON T.code = TT.code" & vbCrLf

VBA マクロ SQL サブクエリ

また、VBAでの文字列生成が多くなる場合は、
データの挿入:バルクインサート
・テスト用のテーブル作成 ・VBAの改善点の概要 ・バルクインサートのSQL解説 ・バルクインサートのVBAコードと動作検証 ・文字列操作を改善する方法とVBAコード ・標準モジュールでの使い方と、100万行の実行結果 ・バルクインサートの最後に
ここで紹介しているStringbuilderクラスを使うと、文字列作成のVBAが書きやすくなるはずです。

サブクエリのネストとSQLコメント&整形の最後に

今回は、サブクエリを多段階にネストする書き方と、
SQLのコメントの書き方や、SQLの整形について解説しました。

サブクエリを使っていくと、かなり複雑な処理もSQL作成できるようになります。
ただし、それとともにSQLはより複雑化していきます。
SQLを付けたし付けたしで拡張していった結果、SQLがサブクエリだらけになってしまうこともあります。

このような場合に、SQLのサブクエリをすっきり書き直す方法があります。
それがWITH句、共通テーブル式と呼ばれるもので、同じようなサブクエリはWITH句を使用して共通化することができます。
次回は、このWITH句について解説します。



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

トランザクション処理
VBAクラスの全コード:トランザクション処理
サブクエリ(副問合せ)
サブクエリのネストとSQLコメント&整形
WITH句(共通テーブル式)
取得行数を限定するLIMIT句
分析関数(OVER句,WINDOW句)
「ADO + VBA」でSQLを実行するときのVBAサンプル
SQL基礎問題1:最大在庫数を持つ製品の在庫金額
SQL基礎問題2:文字列「-nn-」のnnが偶数のみ抽出
SQL基礎問題3:文字列の一部をキーにして集計


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

カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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