前回は、「AccessでSQLビューを使えることにより、どんなメリットがあるか」ということについて述べました。
今回からは更に一歩踏みこんで、SQL文の書き方についてより詳しく解説していきます。
第一回目の今回は「SELECT文」の前編です。
もくじ
ここでは「購買管理DB」をサンプルにしてSQLビューを書いていきます。
サンプルデータベースはこちらからダウンロードできます。
「クエリのSQLビューにSQL文を直接書く」という想定で話を進めていきますが、必ず「ゼロから書かなければいけない」ということはありません。
SQL文のコーディングに敷居を高く感じた方は、「デザインビューで自動生成されたSQL文を分かりやすく手直しする」といった感覚で読み進めるとよいでしょう。
シンプルなSELECT文
それでは、条件設定や並べ替えなどの設定を設けない「シンプルなSELECT文」から進めてみましょう。
「シンプルなSELECT文」は2つの書き方に分けることができます。
テーブルのデータをそのまま参照する
まずはテーブルのデータをそのまま参照する書き方です。
SELECT * FROM T01部品マスタ;
「*(アスタリスク)」は、全てのフィールドを参照するときに使います。
また、すべてのSQL文に共通しますが、文末に「;(セミコロン)」を入れるクセをつけておきましょう。
元データの「T01部品マスタ」です。
実際にSQLビューにSELECT文を書いてみます。
データシートビューに切り替えてみます。
切り替えた結果、全く元データと同じ結果を出力しました。
この構文のみでは意味がないように感じられますが、他のSQL文を学習する一番の基礎になりますのでしっかりと覚えておきましょう。
特定のフィールドのみを参照する
抽出するフィールドを指定したい時のパターンです。
SELECT 品名 FROM T01部品マスタ;
実行すると、「品名」のみが結果として表示されます。
今度は複数のフィールドを指定してみます。
フィールドの間は「,(カンマ)」で区切るようにしましょう。
SELECT 品名, 型式 FROM T01部品マスタ;
実行すると、「品名」と「型式」のみが表されます。
WHERE句で条件抽出
レコード(行)の条件を指定する書き方になります。
Accessを使っていると、VBAエディターに条件抽出を含んだSQLを書く機会にときどき遭遇します。
データ型や条件の設定範囲による書き方の違いだけは覚えておきましょう。
簡単な手修正をすぐに行えると、デザインビューを作ってコピペする時間を省略できます。
データ型
データ型によっては、条件の前後に記号が必要になります。
数値
数値の場合は何も必要ありません。
SELECT * FROM T01部品マスタ WHERE 小分類ID = 6;
実行してみると、小分類IDが6のレコードのみが抽出されました。
日付/時間
日付や時間で条件を設定する場合は、前後に「#」を入れる必要があります。
SELECT * FROM T02発注伝票 WHERE 発注日 = #2020/6/14#;
日時を指定する場合は、「#2020/6/14 12:30:00#」のように指定します。
実際にSQLを書いてみましょう。
抽出前の「T02発注伝票」テーブルデータです。
SELECT文を実行してみると、6月14日のデータのみが抽出されました。
文字列
文字列の場合も記号が必要になります。
デザインビューからSQL文を作成した場合、「“(ダブルクォーテーション)」が使われています。
SELECT * FROM T01部品マスタ WHERE 伝票表示 = "型式";
SQL文を手修正する場合は、「’(シングルクォーテーション)」に変える習慣を身につけておくとよいです。
SELECT * FROM T01部品マスタ WHERE 伝票表示 = '型式';
VBAの場合「“」を使うとエラーになってしまいます。
デザインビューから作ったSQL文をそのままVBAに活用しようとしても、正常に作動しないので注意が必要です。
どちらのSELECT文も「型式」を含んだレコードが抽出されます。
条件の設定方法
抽出条件の設定についても、数通りの方法があります。
うまく使い分けることで、より細かい条件を設定することができます。
完全一致
条件が完全一致するものを抽出したい場合は等号(=)を使います。
シンプルな抽出条件です。
SELECT * FROM T01部品マスタ WHERE 小分類ID = 10;
SQL文を書いて結果を出力すると、下のような結果が表示されました。
範囲検索
範囲を選択する時は不等号やBETWEENを使います。
下に例文を載せておきます。
SELECT * FROM T02発注伝票 WHERE 発注日 >= #2020/6/14# AND 発注日 <= #2020/8/1#;
SELECT * FROM T02発注伝票 WHERE 発注日 Between #2020/6/14# AND #2020/8/1#;
どちらも同じ結果を出力します。
しかし、範囲選択の場合は「BETWEEN」に慣れておくとよいでしょう。
さらに複数の検索条件が重なった場合、不等号よりBETWEENの方が解読しやすいです。
あいまい検索
特定の文字を含む行を含むレコードを抽出する時に使われます。
おそらく世界で最も使われている検索方法なのではないでしょうか?
- YahooやGoogle、Youtubeなどのように検索窓を使った検索エンジン
- Amazonや楽天などの商品検索
- 図書館などの蔵書検索システム
ざっと思いつくだけでもこのように様々なシステムで使われています。
Accessのあいまい検索では「Like」 と「*(アスタリスク)」を組み合わせます。
SELECT * FROM T01部品マスタ WHERE 品名 Like '*ドライバ*';
「ドライバ」を含むレコードが抽出されました。
「*ドライバ」の場合は、文字列のおわりに「ドライバ」を含む場合に限られます。
- 充電式インパクトドライバ →〇
- ボールグリップドライバー →×
一方、「ドライバ*」は逆に文字列の最初に「ドライバ」を含む条件を検索します。
論理演算子
複数の条件を設定する場合は論理演算子を使用します。
AND・OR・NOTなどにあたります。
また、データベースの種類によっても書き方が全く違いきますので、注意が必要です。
ORDER BY句で並べ替え
抽出されたデータは、ORDER BY句で並べ替えることができます。
SQL文の文末に入れるようにしましょう。
途中にORDER BY句を入れると正しく検索できない場合があります。
単独条件で並び替え
並び替えの設定ですが、昇順の場合は「ASC」、降順の場合は「DESC」を使います。
省略した場合はデフォルトの昇順で表示されます。
SELECT * FROM T01部品マスタ ORDER BY 部品登録ID ASC;
SELECT * FROM T01部品マスタ ORDER BY 部品登録ID DESC;
下の出力結果は降順に設定したものです。
複数条件で並び替え
複数条件を設定する場合は「,(カンマ)」で区切ります。
先に記載した方の並べ替えを優先します。
SELECT * FROM T01部品マスタ ORDER BY 小分類ID DESC ,部品登録ID ;
実際にSQL文を入力した結果は下のとおりです。
JOIN句でテーブル同士をつなぐ
JOIN句を使うことでテーブル同士でつなぐことができます。
複数のテーブルを一つの表にまとめることができるのがSQL文を使う大きなメリットです。
JOIN句の中でも内部結合と外部結合に分けられます。
JOIN句を使うときの条件は、両方のテーブルに同じフィールドが含まれていることです。
内部結合
「内部結合」は、両方のテーブルに合致するレコードのみを抽出します。
SELECT 部品登録ID, 品名, 型式, 規格, サイズ, T00小分類マスタ.小分類ID, 小分類名 FROM T00小分類マスタ INNER JOIN T01部品マスタ ON T00小分類マスタ.小分類ID = T01部品マスタ.小分類ID;
結合するフィールドを表示させる場合、テーブル名も記載しないといけないのがJOIN句の大事なポイントです。
「小分類ID」だけでは結果を表示させることができません。
「T01小分類マスタ.小分類ID」といった表記になります。
実際に出力した結果は以下のとおりです。
T01部品マスタとT00小分類マスタを一つの表にまとめることができました。
外部結合
「外部結合」は片方のテーブルの全レコードを表示します。
SELECT 部品登録ID, 品名, 型式, 規格, サイズ, T00小分類マスタ.小分類ID, 小分類名 FROM T00小分類マスタ LEFT JOIN T01部品マスタ ON T00小分類マスタ.小分類ID = T01部品マスタ.小分類ID;
ここでは、T001小分類マスタを全レコード表示させています。
T00小分類マスタ.小分類ID = T01部品マスタ.小分類ID
となっていますが、左側のレコードを全件表示させていますので、「LEFT JOIN」という書き方になっています。
実際にSQL文を書いて出力させると下のようになりました。
T01部品マスタのフィールドが存在しなくても空白で表示されています。
まとめ
今回は、Accessで使えるSELECT文について解説しました。
SQL文の基礎をマスターしておくと、デザインビューから作成されたSQL文を自分の好みに合わせてカスタマイズできます。
デザインビューからしかクエリをつくることができない人よりも、ムダのないAccessデータベースを作ることができますので、ぜひ習得しておくことをオススメします。
次回(第2回)のSELECT文後編では、簡単な関数、集計クエリ、クロス集計クエリ、ユニオンクエリについて解説します。
≫ 【SQL学習入門】2回目:Accessで使えるSELECT文(後編)