SQLをちょっとだけ(ExcelでRDBその10)

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

SQLをちょっとだけ

 前回は、関連性ってどういうことで何が出来るのか、そして外部キーを使うとどうなるのかについてご紹介しました。関連性を持たせることで、複数のテーブルから色々な形でデータが取り出せるのですね。そして、データの取り出しに使うのがSQLのJOIN。SQLを使えばもっと色々なことが出来そうです。この連載はVBAAccessのデータベースファイルを操作することを目的としていますので、あまりSQLに傾倒すると本筋から外れてしまいそうなのですが、今回はちょっとだけSQLにのめりこんでみようと思います。
f:id:HiroCom777:20201209220055j:plain

INNER JOINとは

 まず、前回ご紹介したSQL文を見てみましょう。

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

これは売上明細テーブルと商品データテーブルから、それぞれの"商品ID"をキーとしてデータを抽出するSQL文です。具体的には以下の手順ですね。
・抽出するフィールド名のリストをSELECT句の後ろにコンマ区切りで列挙する
 SELECT フィールド名1,フィールド名2・・・ みたいな感じです。フィールド名はどちらのテーブルにあるのか判らなくなる時があるのでテーブル名.フィールド名の形で指定できます。

・FROM句との後に参照するテーブルを指定する
 こちらのテーブルを左テーブルと呼んだりします。
・INNER JOIN句の後にもう一つの参照するテーブルを指定する
 こちらのテーブルは右テーブルと呼んだりします。
・ON句でどのフィールドで結合するかを指定する
 左テーブル、右テーブルののどのフィールドで結合するかを指定します。
 左テーブル.フィールド名 = 右テーブル.フィールド名 などと書いたりします。複数の式をANDやORで結合することも出来ます。今回は両方のテーブルの"商品ID"をキーとして結合しました。結果、以下の様になったということです。

f:id:HiroCom777:20201123232613j:plain
いつ、どの商品が何個売れたかわかるようになりました。

LEFT JOINとRIGHT JOIN

JOINにも色々種類があって、INNER JOINは結合するフィールドの値が双方のテーブルにある場合のみ選択表示されます。これを内部結合といいます。他にも外部結合というものがあります。外部結合は、結合するフィールドの値がどちらかのテーブルにある場合にも選択表示されます。右テーブルのフィールドに値がない場合でも左テーブルの項目を表示する場合をLEFT JOIN。逆をRIGHT JOINといいます。使い方はINNER JOINと一緒です。試しに上記のSQLをRIGHT JOINに書き換えて実行すると、以下の様になりました。

f:id:HiroCom777:20201209211743j:plain
リンゴとパイナップルの商品IDの番号は、売上明細テーブルには表れてこないので、IDや日付、個数は表示されません。これらの商品は売れていないことが判ります。ちなみに、LEFT JOINとして実行するとINNER JOINと同じ結果になります。売上明細テーブルの商品IDの値は、全て商品データテーブルの商品IDに記載されているものだからです。

やはり、3つの中で一番使用する機会が多いのはINNER JOINだと思います。

SQL便利!!

 やはりSQLは便利。そしてデータベースを学ぶ上で必要不可欠な技術です。次回ももう少しだけSQLに触れていきたいと思います。お楽しみに!!
hirocom777.hatenadiary.org

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