Microsoft AccessSQLクエリを最初から作成する方法

Microsoft AccessSQLクエリを最初から作成する方法

Microsoft Accessは、間違いなくMicrosoft Officeスイート全体の中で最も強力なツールですが、Officeのパワーユーザーを不思議に思う(そして時には怖がらせる)こともあります。 WordやExcelよりも学習曲線が急であるため、このツールの使用に頭を悩ませる人はいるでしょうか。今週、Bruce Epperは、読者の1人からのこの質問によって引き起こされた問題のいくつかを見ていきます。





読者は尋ねます:

Microsoft Accessでクエリを作成するのに問題があります。数値の製品コードと関連する製品名を含む共通の列を含む2つの製品テーブルを含むデータベースがあります。表Aのどの製品を見つけることができるかを知りたいのですが、表Bに、結果という名前の列を追加します。この列には、表Aの製品名が存在する場合はそれが含まれ、表Aに存在しない場合は表Bの製品名が含まれます。アドバイスはありますか?





ブルースの返信:

Microsoft Accessは、WindowsマシンとMacマシンの両方で使用するために設計されたデータベース管理システム(DBMS)です。これは、データ処理とストレージにMicrosoftのJetデータベースエンジンを利用しています。また、構造化照会言語(SQL)を理解する必要がほとんどないユーザー向けのグラフィカルインターフェイスも提供します。





SQLは、データベースに格納されている情報を追加、削除、更新、および返すため、およびテーブルやインデックスの追加、削除、変更などのコアデータベースコンポーネントを変更するために使用されるコマンド言語です。

出発点

Accessまたは別のRDBMSにまだある程度精通していない場合は、先に進む前にこれらのリソースから始めることをお勧めします。



これらの記事で提供されている概念の基本を理解していると、次のことが少しわかりやすくなります。

データベースの関係と正規化

世界中で50種類のウィジェットを販売している会社を経営していると想像してみてください。あなたは1,250のクライアントベースを持っており、平均月にこれらのクライアントに10,000のウィジェットを販売しています。現在、単一のスプレッドシートを使用して、これらすべての売上を追跡しています。事実上、単一のデータベーステーブルです。そして毎年、スプレッドシートに数千行が追加されます。





上記の画像は、使用している注文追跡スプレッドシートの一部です。ここで、これらのクライアントの両方が年に数回あなたからウィジェットを購入するので、両方の行がはるかに多いとしましょう。





JoanSmithがTedBainesと結婚して彼の名前を取得した場合、彼女の名前を含むすべての行を変更する必要があります。 「JoanSmith」という名前の2つの異なるクライアントがある場合、問題はさらに複雑になります。かなり一般的なイベントのため、販売データの一貫性を保つことが非常に難しくなっています。

データベースを使用してデータを正規化することにより、アイテムを在庫、クライアント、注文などの複数のテーブルに分けることができます。

この例のクライアント部分を見ると、クライアント名とクライアントアドレスの列が削除され、新しいテーブルに配置されます。上の画像では、データへのよりきめ細かいアクセスのために、物事をより適切に分類しています。新しいテーブルには、主キー(ClientID)の列も含まれています。これは、このテーブルの各行にアクセスするために使用される番号です。

このデータを削除した元のテーブルに、この特定のクライアントの情報を含む適切な行にリンクする外部キー(ClientID)の列を追加します。

これで、JoanSmithが名前をJoanBainesに変更したときに、変更を行う必要があるのはClientテーブルで1回だけです。結合されたテーブルからの他のすべての参照は適切なクライアント名を取得し、Joanが過去5年間に購入したものを調べているレポートは、レポートの生成方法を変更することなく、旧姓と既婚の両方の名前ですべての注文を取得します。

追加の利点として、これにより、消費されるストレージの総量も削減されます。

結合タイプ

SQLは、INNER、LEFT OUTER、RIGHT OUTER、FULL OUTER、およびCROSSの5つの異なるタイプの結合を定義します。 OUTERキーワードは、SQLステートメントではオプションです。

Microsoft Accessでは、INNER(デフォルト)、LEFT OUTER、RIGHT OUTER、およびCROSSを使用できます。 FULL OUTER自体はサポートされていませんが、LEFT OUTER、UNION ALL、およびRIGHT OUTERを使用すると、CPUサイクルとI / O操作が増えるという犠牲を払って偽造することができます。

CROSS結合の出力には、左側のテーブルのすべての行と右側のテーブルのすべての行がペアになっています。 CROSS結合が使用されているのを見たのは、データベースサーバーの負荷テスト中だけです。

基本的な結合がどのように機能するかを見てみましょう。次に、ニーズに合わせてそれらを変更します。

次のデザインプロパティを使用して、ProdAとProdBの2つのテーブルを作成することから始めましょう。

AutoNumberは、エントリがテーブルに追加されるときに、エントリに割り当てられる自動的にインクリメントされる長整数です。テキストオプションは変更されていないため、最大255文字のテキスト文字列を受け入れます。

次に、それらにいくつかのデータを入力します。

3つの結合タイプの動作の違いを示すために、ProdAからエントリ1、5、および8を削除しました。

次、 新しいクエリを作成する に行くことによって 作成>クエリデザイン 。 [テーブルの表示]ダイアログから両方のテーブルを選択し、 [追加]をクリックします 、 それから 選ぶ

テーブルProdAのProductIDをクリックし、テーブルProdBのProductIDにドラッグし、マウスボタンを離してテーブル間の関係を作成します。

アイテム間の関係を表すテーブル間の線を右クリックし、 [結合プロパティ]を選択します

デフォルトでは、結合タイプ1(INNER)が選択されています。オプション2はLEFTOUTER結合で、3はRIGHTOUTER結合です。

最初に内部結合を確認するので、[OK]をクリックしてダイアログを閉じます。

クエリデザイナで、ドロップダウンリストから表示するフィールドを選択します。

クエリ(リボンの赤い感嘆符)を実行すると、両方のテーブルのProductNameフィールドが表示され、最初の列にテーブルProdAの値、2番目の列にProdBの値が表示されます。

結果には、両方のテーブルでProductIDが等しい値のみが表示されていることに注意してください。テーブルProdBにProductID = 1のエントリがありますが、ProductID = 1がテーブルProdAに存在しないため、結果には表示されません。同じことがProductID = 11にも当てはまります。これはテーブルProdAには存在しますが、テーブルProdBには存在しません。

リボンの[表示]ボタンを使用してSQLビューに切り替えると、これらの結果を取得するために使用されたデザイナーによって生成されたSQLクエリを確認できます。

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA INNER JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

デザインビューに戻り、結合タイプを2(LEFT OUTER)に変更します。クエリを実行して結果を確認します。

ご覧のとおり、テーブルProdAのすべてのエントリが結果に表示されますが、テーブルProdBのProductIDエントリが一致するProdBのエントリのみが結果に表示されます。

テーブルProdBに一致する値がないため、ProdB.ProductName列の空白スペースは特別な値(NULL)です。これは後で重要になります。

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA LEFT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

3番目のタイプの結合(RIGHT OUTER)でも同じことを試してください。

結果には、ProdAテーブルに一致する値がない場合に空白(NULLと呼ばれる)値が表示されている間、テーブルProdBのすべてが表示されます。これまでのところ、これは私たちの読者の質問で望まれる結果に最も近いものになります。

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

クエリでの関数の使用

関数の結果は、クエリの一部として返される場合もあります。 「結果」という名前の新しい列を結果セットに表示する必要があります。 ProdAに値がある場合(NULLでない場合)、その値はテーブルProdAのProductName列の内容になります。それ以外の場合は、テーブルProdBから取得する必要があります。

イミディエイトIF(IIF)関数を使用して、この結果を生成できます。この関数は3つのパラメーターを取ります。 1つ目は、TrueまたはFalseの値に評価する必要がある条件です。 2番目のパラメーターは、条件がTrueの場合に返される値であり、3番目のパラメーターは、条件がFalseの場合に返される値です。

私たちの状況の完全な関数構造は次のようになります。

IIF(ProdA.ProductID Is Null, ProdB.ProductName,ProdA.ProductName)

条件パラメーターが等しいかどうかをチェックしないことに注意してください。データベース内のNull値には、別のNullを含む他の値と比較できる値がありません。言い換えれば、NullはNullと等しくありません。これまで。これを乗り越えるために、代わりに「Is」キーワードを使用して値をチェックします。

'Is Not Null'を使用し、TrueパラメーターとFalseパラメーターの順序を変更して同じ結果を取得することもできます。

これをクエリデザイナに配置するときは、関数全体をField:エントリに入力する必要があります。 「結果」列を作成するには、エイリアスを使用する必要があります。これを行うには、次のスクリーンショットに示すように、関数の前に「結果:」を付けます。

これを行うための同等のSQLコードは次のようになります。

SELECT ProdA.ProductName, ProdB.ProductName, IIF(ProdA.ProductID Is Null,ProdB.ProductName,ProdA.ProductName) AS Results FROM ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

ここで、このクエリを実行すると、これらの結果が生成されます。

LastPassアカウントを削除する方法

ここでは、テーブルProdAに値がある各エントリについて、その値が[結果]列に反映されていることがわかります。 ProdAテーブルにエントリがない場合、ProdBからのエントリが結果に表示されます。これは、読者が尋ねたとおりです。

Microsoft Accessを学習するためのその他のリソースについては、JoelLeeの「MicrosoftAccessの学習方法:5つの無料オンラインリソース」を参照してください。

共有 共有 つぶやき Eメール Windows 11にアップグレードする価値はありますか?

Windowsが再設計されました。しかし、それはWindows10からWindows11に移行するように説得するのに十分ですか?

次を読む
関連トピック
  • 生産性
  • 専門家に聞く
著者について ブルースエッパー(13件の記事が公開されました)

ブルースは70年代から電子機器、80年代初頭からコンピューターで遊んでおり、彼がずっと使ったことも見たこともないテクノロジーについての質問に正確に答えています。彼はまたギターを弾こうとして自分自身を悩ませます。

ブルースエッパーのその他の作品

ニュースレターを購読する

ニュースレターに参加して、技術的なヒント、レビュー、無料の電子書籍、限定セールを入手してください。

購読するにはここをクリックしてください