SQLをもうちょっと(ExcelでRDBその11)

ExcelRDB(リレーショナルデータベース)を操作してみようという連載のその11です。前回の記事はこちらです。
hirocom777.hatenadiary.org

SQLをもうちょっと

 前回は、2つのテーブルからデータを抽出するSQLのJOINについてご紹介しました。で、今回はというと前回の記事をまとめている際に気が付いたり、これは大切だなって思ったところをまとめておきたいと思います。以下の記事で使用したソースコードSQL文の部分をこれからご紹介するように書き換えて実行してみましょう。
その9:関連性で何が出来るのか

f:id:HiroCom777:20201214223329j:plain

計算もしてくれませんか?

 前回のの結果で表示されるのは、ID、日付、商品名、単価、数量です。単価×数量で売り上げもわかるわけで、これも表に表示出来たら便利です。その場合には、SQLを以下の様に記述します。

"sqlCmd = SELECT 売上明細.ID,売上明細.日付,商品データ.商品名,商品データ.単価,売上明細.数量,(商品データ.単価*売上明細.数量) " _
         & "FROM 売上明細 INNER JOIN 商品データ ON 売上明細.商品ID = 商品データ.商品ID "

違いが判りますか?SELECT句の後に指定するフィールド名のあとにコンマで区切って
(商品データ.単価*売上明細.数量)
って追記しました。すると・・・

f:id:HiroCom777:20201208230023j:plain
あ、計算できてる!!商品の単価と売り上げの数量をかけた数値が取得できています。これは便利ですね!!このように記述すると、フィールドのデータ同士で掛けて計算することができます。勿論、加減乗除全て可能です。解りやすさのためにカッコで区切りましたが、無くても問題ないです。

もう少しシンプルに

 色々考えていくうちにSQL文がだんだん長くなってきて、解りづらくなることがあります。何とかして簡単にする方法はないかなって探していたのですが、エイリアス(別名)という手法がありました。テーブル名を別名に置き換えてシンプルにできます。上のコードにテーブル名のエイリアスを適用すると・・・

 "sqlCmd = SELECT a.ID,a.日付,b.商品名,b.単価,a.数量,(b.単価*a.数量) " _
          & "FROM 売上明細 AS a INNER JOIN 商品データ AS b ON a.商品ID = b.商品ID "

 ずいぶんシンプルになりましたね。FROM句とINNER JOIN句の後に続くテーブル名の記述を
テーブル名 AS 別名
と記述すると、SQL文中のテーブル名を別名に置き換えることだ出来るのです。

ちなみにASは省略してスペースに置き換えることが出来ます。更に実を言うと、フィールド名の前のテーブル名.は、フィールド名がテーブル間でかぶらない場合省略してもいいのです。つまり、今回の場合テーブル名の表記が必要なのはそれぞれのテーブルの商品IDだけとなります。結果的に以下の様になります。

sqlCmd = "SELECT ID,日付,商品名,単価,数量,(単価*数量) " _
         & "FROM 売上明細 a INNER JOIN 商品データ b ON a.商品ID = b.商品ID "

かなりシンプルになりました。でもASの省略はともかく、テーブル名の省略は解りずらくなるのでやめておいた方がいいと思います。

サブクエリ(副問い合わせ)

 他にもSQL文をシンプルに書く方法にサブクエリがあります。SELECT句のSQL文をかっこで括って一つのテーブルとして使うことが出来るのです。以下に例を示します。上の問い合わせで得られた結果のうち、商品名がバナナであるレコードを抽出したいとします。

sqlCmd = "SELECT a.ID,a.日付,b.商品名,b.単価,a.数量,(b.単価*a.数量) " _
        & "FROM 売上明細 a RIGHT JOIN 商品データ b ON a.商品ID = b.商品ID "
sqlCmd = "SELECT * FROM (" & sqlCmd & ") WHERE 商品名 = 'バナナ'"

このSQL文を実行すると、以下の様になります。
f:id:HiroCom777:20201214222925j:plain
商品名がバナナのレコードを抽出できました。
SELECT句は、データベースから条件を指定してレコードを抽出するSQL文ですが、これをかっこで括ると一つのテーブルとして扱うことが出来ます。上記の例では、一度INNER JOINで二つのテーブルを結合する処理を書いた後に、そのテーブルから商品名がバナナのレコードを抽出しています。これを一つの文で書くのはちょっと難しいのではないのでしょうか。サブクエリを使用する際には、一度サブクエリ内のSQL文だけを実行して実行結果を確認してから本体のSQL文を作成するといいと思います。あとサブクエリは動作が遅くなりがちなので、頻繁に使用したり、大きなデータを処理するのには向かないかもしれません。

ツールを作ってみるかな・・・

 ここまで来て思うのです。何かツールは作れないかな・・・って。この連載を書くにしても、Accessファイルを作ったり、内容を確認したり、編集したりって、結構面倒なんですよ。まずは、ファイルを確認できるツールから考えてみようと思います。お楽しみに!!
 
hirocom777.hatenadiary.org


ExcelVBAでAccessファイルを操作する連載はコチラから