【MS Access】クエリからSQLの生成について

MS Access
スポンサーリンク

Accessでクエリを作成してデータ抽出は出来るけど、SQLはわからないという人は非常に多いかと思います。Accessはクエリを使えば、マウスのドラッグ&ドロップだけでデータ抽出が行えて、データベースを扱う敷居を大きく下げてくれる為、大変便利な機能です。

ただ、AccessやExcelのVBAを使ってデータベースへ接続するようなアプリケーションを作成したり、周りの同僚が開発系技術者だったりすると、SQLの知識がどうしても必要になってきます。

そこで、今回は「クエリは作れるけどSQLはわからない」という人向けにSQLを簡単に作る方法を紹介していきます。

そもそもSQLってなんだ?

文法などの記述仕様が規格で標準化されたデータベース操作に特化したプログラミング言語です。データベースに対して、「このデータを取ってこい」とか「こういう条件に当てはまるデータは全て書き換えろ」とか「こんなテーブルを作れ」といった命令を行います。

記述仕様が標準化されていると記載しましたが、データベースソフトは多くの製品があり、メーカーが有償で販売している製品もあれば、有志が無償で開発し提供している製品もあります。これらの製品間では、根幹の基本となるSQLの記述方法については共通していますが、各製品ごとに独自の機能拡張を行っており、その結果方言のように細かい差異はあります。

参考までに有名なデータベース製品を以下に挙げてみます。

データベース製品例

■有償
Oracle
→言わずと知れたナンバー1データベース製品。ライセンス料もナンバー1ですが・・・。
Microsoft SQL Server
→Oracleほど高価では無いが、その分機能や性能もそこそこ。
Microsoft Access
→Officeの1ファイルでありながら、一応データベースとしても使えます。

■無償利用可能
PostgreSQL
→日本国内で言えばもっとも多く利用されている無償データベース製品。有志が開発しています。
MySQL
→無償データベース製品の世界シェアナンバー1。Web系システムは大抵これかと。

 

クエリからSQL文を生成してみよう

クエリを作成すると、Accessの内部的にはSQLを自動生成しています。クエリを実行する場合は、その作成したSQLを実行しています。

その内部的に作成したSQLですが、クエリエディタ画面でも表示したり編集することができます。その手順を紹介します。

簡単なクエリを作成する

まずは簡単なクエリを作成してください。例えばリンクテーブルのテーブルを一つ参照し、簡単な取得条件を設定してみましょう。

クエリエディタ右下のSQL切り替えボタンを押す

クエリエディタの右下に以下のような項目が表示されています。

現在選択されている一番右がクエリデザイナー表示を表しています。その隣に小さく「SQL」と書かれた項目があり、そこをクリックしてみてください。

SELECT dbo_マスタ.[コード], dbo_マスタ.[テキスト1]
FROM dbo_マスタ
WHERE (((dbo_マスタ.[コード])="1"));

作成したクエリ内容やテーブル名等の内容によって異なりますが、上記の様な文字列が表示されましたでしょうか?

これがAccessが自動生成したSQLです。

SQLを理解していこうとした場合、クエリを作って、それをSQLに自動変換したものを参考にすることで、SQLの理解もし易くなるかとおもいます。

ただ、Accessのクエリから生成したSQLについては何点か気を付けないといけないことがあります。

注意1 構文が冗長、且つ無駄が多い
上記のSQL例で言えば3行目では、WHERE句が記述されており、三つの括弧で条件が括られています。ただ、本来の構文としてはこの括弧はすべて不要です。括弧を付けたまま実行してもエラーにはなりませんが、括弧を外して実行してもエラーは出ず、データの取得結果に変わりはありません。Accessが自動生成したSQLなので、無駄な記述も多く、複雑なクエリからSQLを生成した場合は非常に解読がし難いSQLが出来上がります。

注意2 リンクテーブルだとデータベース上の実テーブル名と異なる
このSQLをAccess内のリンクテーブルに対して実行する分には問題ないですが、もしOracleやSQL Serverに対して、パススルークエリなどで直接SQLを渡したり、Access以外のデータベース接続ソフトを介してSQLを実行する際には、このSQLだとエラーになります。

Accessのリンクテーブル機能でOracleやSQLServer等のデータベース内のテーブルへリンクを設定すると、そのリンクテーブルのテーブル名が以下のように作成されます。

[スキーマー名]_[テーブル名] ※アンダースコアが勝手に入る

スキーマーとはデータベース内のテーブル群をまとめているグループ名の様なものです。ただ、データベースにSQLを直接実行する場合は、スキーマ名は無くて良い場合が多いですし、スキーマ名を指定する場合はアンダースコアではなく、ドットでスキーマ名とテーブル名を結合します。

見辛いSQLを書き直そう

よって、上記の自動生成されたSQLをより見やすく書き直したのが以下になります。

SELECT コード,テキスト1
FROM マスタ
WHERE コード = '1';

すっきりしましたね。他にもAccessでは文字列を表す際にはダブルクォーテーションで括りますが、一般的なデータベースではシンブルクォーテーションで括ります。そこも修正してあります。

最後に

Accessのクエリを元に自動生成したSQLですと、そのまま他のデータベースに対して実行することはできませんが、クエリからどの様なSQLを生成するかを参考にして、SQLの学習をしたり、生成したSQLを元に修正して習得していく方法も良いのではないかと思います。

因みに、どちらにせよSQL自体をちゃんと体系的に学ぶ必要もある為、以下のサイト様の記事がわかりやすそうなのでリンクさせて頂きます。わかりやすくて良いですね!

SQLの基本を覚える【初心者向け】

皆さまのご参考になれば幸いです。ではでは。