AccessのクエリでSQL文を実行する手順を解説:詳細ガイド
Microsoft Accessは、リレーショナルデータベース管理システム(RDBMS)として広く利用されており、データの格納、管理、分析、報告書作成など、多岐にわたる機能を備えています。Accessの最も強力な機能の一つが「クエリ」です。クエリを使用すると、データベース内のテーブルから必要なデータを抽出したり、データを集計したり、変更したり、新しいテーブルを作成したりすることができます。
Accessのクエリは、通常、「クエリデザイナー」という視覚的なツールを使って作成・編集されます。これは、テーブルを配置し、フィールドをドラッグ&ドロップし、条件や並べ替えを指定することで、直感的にクエリを作成できる非常に便利な機能です。しかし、Accessのクエリは、内部的には「SQL (Structured Query Language)」というデータベース言語によって定義されています。SQLは、ほぼすべてのリレーショナルデータベースで使用されている標準的な言語であり、SQLを理解し、Accessのクエリ内で直接SQL文を記述・実行できるようになることは、Accessの機能を最大限に引き出し、より複雑で柔軟なデータ操作を行う上で不可欠です。
本記事では、AccessのクエリにおいてSQL文をどのように扱い、実行するのかについて、初心者の方でも理解できるよう詳細に解説します。クエリデザイナーとの関係、SQLビューの利用方法、一般的なSQLコマンド、さまざまなクエリタイプに対応するSQL、そしてSQLビュー利用時の注意点に至るまで、網羅的に説明します。
第1章:Accessクエリの基本とSQLの関係
Accessクエリは、データベースから情報を取得したり、データを操作したりするための要求(Request)です。クエリにはいくつかの種類があります。
- 選択クエリ (Select Query): テーブルからデータを抽出して表示します。最も一般的に使用されるクエリです。データの抽出、フィルタリング、並べ替え、集計などを行います。
- アクションクエリ (Action Query): データベース内のデータを変更するクエリです。
- 追加クエリ (Append Query): あるテーブルから別のテーブルにレコードを追加します。
- 更新クエリ (Update Query): テーブル内の既存のレコードの値を変更します。
- 削除クエリ (Delete Query): テーブルからレコードを削除します。
- テーブル作成クエリ (Make-Table Query): クエリの結果を基に新しいテーブルを作成します。
- クロス集計クエリ (Crosstab Query): データを集計し、結果をスプレッドシートのようなマトリックス形式で表示します。
- 集合クエリ (Union Query): 複数の選択クエリの結果を結合して一つの結果セットとして表示します。
- パススルー クエリ (Pass-Through Query): Access外部のデータベース(SQL Server, Oracleなど)に対して、Accessを介さずに直接SQL文を送信・実行します。
- データ定義クエリ (Data-Definition Query): テーブルやインデックスを作成、変更、削除するなど、データベースの構造を変更します。(クエリデザイナーでは通常作成せず、SQLビューで直接記述します)
これらのクエリは、ユーザーがクエリデザイナー上で視覚的に操作して作成した場合でも、Accessの内部では対応するSQL文に変換されて実行されます。SQL文は、これらのクエリが「何を」「どこから」「どのように」実行するのかを正確に記述したものです。
クエリデザイナーとSQLビュー
Accessでクエリを操作する際には、主に以下の3つのビューを切り替えて使用します。
- データシートビュー (Datasheet View): クエリの実行結果(抽出されたデータ)を表示します。選択クエリの場合、スプレッドシートのような表形式でデータが表示されます。アクションクエリの場合は、実行前に処理されるレコード数などが表示され、実行確認のプロンプトが表示されます。
- デザインビュー (Design View): クエリを視覚的に設計・編集するビューです。テーブルを配置し、フィールドグリッドで抽出フィールド、抽出条件、並べ替え順などを指定します。アクションクエリの場合は、クエリの種類を切り替えるボタンや、更新先フィールドなどが表示されます。
- SQLビュー (SQL View): クエリに対応するSQL文を直接テキスト形式で表示・編集するビューです。ここでSQL文を記述したり、クエリデザイナーで作成したクエリがどのようなSQL文になっているかを確認したりできます。
クエリデザイナーは直感的で分かりやすい反面、複雑な条件指定や、複数のテーブルの複雑な結合、集合クエリ、パススルー クエリなど、デザイナーでは表現が難しい、あるいは不可能な操作があります。このような場合に、SQLビューが強力なツールとなります。また、SQLビューでクエリを作成・編集することは、SQLの学習にも繋がり、Accessだけでなく他のデータベースシステムを扱う上でも非常に役立ちます。
第2章:既存クエリのSQLビューでの表示・編集
既にAccess内に存在するクエリが、内部的にどのようなSQL文で定義されているかを確認することは、SQLを学ぶ上で非常に有効な手段です。また、クエリデザイナーで作成したクエリを微調整したり、より複雑な要素(例えば副クエリなど)を追加したりする場合にも、SQLビューを利用します。
既存のクエリをSQLビューで表示・編集する手順は以下の通りです。
- ナビゲーションウィンドウでクエリを選択する: Accessのナビゲーションウィンドウ(通常、画面左側に表示されるオブジェクト一覧)から、SQL文を確認したい、または編集したい既存のクエリを見つけます。
- デザインビューで開く: 選択したクエリをダブルクリックすると、通常はデータシートビューで実行結果が表示されます。クエリの構造を確認・編集するには、クエリを右クリックし、表示されるコンテキストメニューから「デザインビュー」を選択します。または、クエリを選択した状態でリボンの「ホーム」タブにある「表示」グループのドロップダウンリストから「デザインビュー」を選択します。
- SQLビューに切り替える: クエリがデザインビューで開いたら、リボンの「ホーム」タブにある「表示」グループのドロップダウンリスト(またはデザインタブの「結果」グループにある「表示」ドロップダウンリスト)をクリックし、「SQLビュー」を選択します。
これで、選択したクエリに対応するSQL文が表示されます。SQLビューには、SQL文を記述するためのテキストエディタのような画面が表示されます。クエリデザイナーで作成したクエリでも、Accessが自動的に生成したSQL文が表示されていることがわかります。
SQL文の確認と編集
SQLビューに表示されたSQL文は、テキストとして自由に編集可能です。例えば、以下のような選択クエリのSQL文が表示されているとします。
sql
SELECT 顧客マスター.顧客ID, 顧客マスター.顧客名, 顧客マスター.住所, 受注データ.受注日, 受注データ.商品コード, 受注データ.数量
FROM 顧客マスター INNER JOIN 受注データ ON 顧客マスター.顧客ID = 受注データ.顧客ID
WHERE (((受注データ.受注日) Between #2023/04/01# And #2024/03/31#))
ORDER BY 顧客マスター.顧客名;
このSQL文は、「顧客マスター」テーブルと「受注データ」テーブルを「顧客ID」フィールドで結合し、2023年4月1日から2024年3月31日までの期間の受注データを抽出し、顧客名で並べ替えていることが読み取れます。
SQLビューでは、このテキストを直接編集してクエリの定義を変更できます。
- 抽出するフィールドを追加・削除する (SELECT句)
- 結合するテーブルや結合条件を変更する (FROM句, JOIN句)
- 抽出条件を変更・追加する (WHERE句)
- 並べ替え順を変更する (ORDER BY句)
例えば、上記のクエリに商品の単価も表示させたい場合、SQL文を以下のように編集します。
sql
SELECT 顧客マスター.顧客ID, 顧客マスター.顧客名, 顧客マスター.住所, 受注データ.受注日, 受注データ.商品コード, 受注データ.数量, 商品リスト.単価 -- ここに商品リスト.単価を追加
FROM (顧客マスター INNER JOIN 受注データ ON 顧客マスター.顧客ID = 受注データ.顧客ID) INNER JOIN 商品リスト ON 受注データ.商品コード = 商品リスト.商品コード -- ここに商品リストテーブルとの結合を追加
WHERE (((受注データ.受注日) Between #2023/04/01# And #2024/03/31#))
ORDER BY 顧客マスター.顧客名;
このように、SQLビューで直接テキストを編集することで、クエリデザイナーでは難しい複数のテーブル結合を含む複雑なクエリも柔軟に作成・変更できます。
編集が終わったら、リボンの「デザイン」タブにある「結果」グループの「実行」ボタンをクリックしてクエリを実行したり、「表示」ドロップダウンリストから「データシートビュー」を選択して結果を確認したりできます。編集内容を保存するには、Ctrl+Sを押すか、「ファイル」タブから「上書き保存」を選択します。
AccessによるSQL文の自動整形
SQLビューでSQL文を記述または編集した後、デザインビューやデータシートビューに切り替えると、Accessが自動的にSQL文を整形(インデントや改行、括弧の付加など)する場合があります。これはAccessの仕様であり、SQL文の構文が正しい限り、機能的な問題はありません。しかし、自分で記述したSQL文の整形が崩れることに戸惑うことがあるかもしれません。これはAccessの自動整形機能によるものなので、気にする必要はありません。
第3章:SQLビューを使った新規クエリの作成
既存のクエリを編集するだけでなく、ゼロから新しいクエリをSQL文のみで作成することも可能です。これは、クエリデザイナーの視覚的な操作に依存せず、完全にSQLのコードとしてクエリを定義したい場合に便利です。
SQLビューを使って新規クエリを作成する手順は以下の通りです。
- 新しいクエリを作成する: Accessのリボンから「作成」タブを選択し、「クエリ」グループにある「クエリウィザード」または「クエリデザイン」をクリックします。新しいクエリを作成するダイアログが表示されます。
- 「テーブルの表示」ダイアログを閉じる: 通常、「クエリデザイン」を選択すると、クエリで使用するテーブルやクエリを選択するための「テーブルの表示」ダイアログが表示されます。SQLビューでゼロから記述する場合は、このダイアログは不要なので、「閉じる」ボタンをクリックして閉じます。
- SQLビューに切り替える: 空白のデザインビュー画面が表示されたら、リボンの「ホーム」タブにある「表示」グループのドロップダウンリスト(またはデザインタブの「結果」グループにある「表示」ドロップダウンリスト)をクリックし、「SQLビュー」を選択します。
これで、SQL文を記述するための空白の画面が表示されます。ここに、作成したいクエリに対応するSQL文を直接入力します。
例えば、顧客マスターテーブルから「顧客ID」「顧客名」「電話番号」を抽出する簡単な選択クエリを作成する場合、以下のように記述します。
sql
SELECT 顧客ID, 顧客名, 電話番号
FROM 顧客マスター;
SQL文の記述が終わったら、既存クエリの編集と同様に、「実行」ボタンで結果を確認したり、「データシートビュー」に切り替えて表示したりできます。内容に問題がなければ、クエリを保存します。
第4章:Accessでよく使うSQLコマンド
ここでは、Accessのクエリで頻繁に使用される基本的なSQLコマンド(句)について解説します。これらのコマンドを組み合わせることで、様々なデータ操作が可能になります。
4.1. SELECT句:抽出フィールドの指定
SELECT
句は、クエリの結果としてどのフィールド(列)を表示するかを指定します。
- 基本的な構文:
sql
SELECT フィールド1, フィールド2, ...
FROM テーブル名; - すべてのフィールドを抽出:
sql
SELECT *
FROM テーブル名;
*
は、指定したテーブルまたはクエリのすべてのフィールドを抽出することを示します。 - 別名 (Alias) の使用: フィールド名やテーブル名に分かりやすい別名をつけることができます。特に長い名前や、複数のテーブルを結合して同じ名前のフィールドが存在する場合に便利です。
sql
SELECT 顧客マスター.顧客名 AS お客様氏名, 受注データ.受注日 AS 日付
FROM 顧客マスター INNER JOIN 受注データ ON 顧客マスター.顧客ID = 受注データ.顧客ID;
AS
キーワードの後に指定した名前が、クエリ結果の列見出しとして使用されます。AccessではAS
を省略してSELECT フィールド名 別名
と記述することも可能ですが、明示的にAS
を使う方が他のデータベースシステムとの互換性が高まります。 - 計算フィールドの作成: 既存のフィールドを使って新しい計算結果のフィールドを作成できます。
sql
SELECT 商品名, 単価, 数量, [単価] * [数量] AS 金額
FROM 受注明細;
計算式やAccess関数を使用できます。フィールド名や計算式にスペースや予約語が含まれる場合は、[]
で囲む必要があります。 - 重複行の削除 (DISTINCT): 結果セットから重複する行を排除して表示します。
sql
SELECT DISTINCT 顧客ID
FROM 受注データ; -- 受注があった顧客IDのリストを重複なく表示
4.2. FROM句:抽出元の指定
FROM
句は、データを抽出する対象となるテーブルやクエリを指定します。
- 基本的な構文:
sql
SELECT フィールド1, ...
FROM テーブル名 または クエリ名; - 複数のテーブル/クエリからの抽出 (結合 – JOIN): 複数のテーブルやクエリからデータを抽出する場合、
FROM
句の中でテーブルを結合します。結合については後述の「高度なテクニック」で詳しく解説しますが、基本的な構文は以下のようになります。
sql
SELECT ...
FROM テーブル1 [JOINの種類] テーブル2 ON 結合条件
[JOINの種類] テーブル3 ON 結合条件 ...;
4.3. WHERE句:抽出条件の指定
WHERE
句は、抽出するレコード(行)を絞り込むための条件を指定します。クエリデザイナーの「抽出条件」行に対応します。
- 基本的な構文:
sql
SELECT ...
FROM ...
WHERE 条件式; - 条件式の例:
- 等しい (=):
WHERE 顧客ID = 'C001'
- 等しくない (<> または !=):
WHERE 状態 <> 'キャンセル'
- より大きい (>), より小さい (<), 以上 (>=), 以下 (<=):
WHERE 金額 >= 10000
,WHERE 受注日 < #2024/01/01#
(Accessでは日付リテラルを#
で囲みます) - 範囲指定 (BETWEEN):
WHERE 受注日 BETWEEN #2023/04/01# AND #2024/03/31#
(指定した範囲 両端を含む を検索) - 部分一致検索 (LIKE): ワイルドカード文字を使用します。Access SQLのワイルドカードは他のSQL方言と異なる場合があるので注意が必要です。(Accessでは
*
が任意の文字列、?
が任意の一文字)WHERE 顧客名 LIKE '山田*'
(山田で始まる名前)WHERE 商品名 LIKE '*ペン*'
(名前にペンを含むもの)WHERE 電話番号 LIKE '03-????-????'
(特定の形式の電話番号)
- リスト内のいずれかに一致 (IN): 指定した値のリストに含まれるかを判定します。
sql
WHERE 顧客区分 IN ('法人', '個人事業主')
WHERE 商品コード IN ('A101', 'B205', 'C310') - NULL値の判定 (IS NULL, IS NOT NULL): フィールドがNULL(値がない状態)であるか否かを判定します。
= NULL
や<> NULL
は使用できません。WHERE 備考 IS NULL
(備考が入力されていないレコード)WHERE 完了日 IS NOT NULL
(完了日が入力されているレコード)
- 等しい (=):
- 複数の条件の組み合わせ (AND, OR, NOT): 複数の条件を論理演算子で組み合わせます。
WHERE 顧客区分 = '法人' AND 担当者 = '佐藤'
(両方の条件を満たす)WHERE 状態 = '処理中' OR 状態 = '保留'
(いずれかの条件を満たす)WHERE NOT 状態 = '完了'
(完了ではないレコード)
条件を組み合わせる際は、括弧()
を使って評価順序を明確にすることをお勧めします。
sql
WHERE (都道府県 = '東京都' OR 都道府県 = '神奈川県') AND 顧客区分 = '法人'
4.4. ORDER BY句:並べ替えの指定
ORDER BY
句は、クエリの結果セットを特定のフィールドの値に基づいて並べ替えるために使用します。クエリデザイナーの「並べ替え」行に対応します。
- 基本的な構文:
sql
SELECT ...
FROM ...
WHERE ... -- WHERE句は省略可能
ORDER BY フィールド1 [ASC|DESC], フィールド2 [ASC|DESC], ...; ASC
は昇順 (小さい方から大きい方へ、AからZへ、古い日付から新しい日付へ) を示します。デフォルトは昇順なので省略可能です。DESC
は降順 (大きい方から小さい方へ、ZからAへ、新しい日付から古い日付へ) を示します。- 複数のフィールドを指定すると、最初のフィールドで並べ替え、同じ値を持つ行があれば次のフィールドで並べ替える、というように優先順位をつけて並べ替えます。
sql
ORDER BY 受注日 DESC, 顧客名 ASC -- 受注日の新しい順に並べ、同じ受注日の場合は顧客名の五十音順に並べる
4.5. GROUP BY句とHAVING句:集計
GROUP BY
句は、指定したフィールドの値に基づいて行をグループ化し、各グループに対して集計関数(COUNT
, SUM
, AVG
, MIN
, MAX
など)を適用して集計結果を得るために使用します。クエリデザイナーの「集計」行に対応します。
- 基本的な構文:
sql
SELECT グループ化フィールド, 集計関数(フィールド)
FROM ...
WHERE ... -- 集計を行う前の個別のレコードに対する条件
GROUP BY グループ化フィールド; SELECT
句で集計関数を使用する場合、集計関数が適用されていないフィールドはすべてGROUP BY
句に記述する必要があります。- 例: 顧客ごとの合計受注金額を計算する
sql
SELECT 顧客ID, SUM(金額) AS 合計金額
FROM 受注データ
GROUP BY 顧客ID; - 複数のフィールドでのグループ化:
sql
SELECT 顧客ID, 商品コード, SUM(数量) AS 商品別合計数量
FROM 受注データ
GROUP BY 顧客ID, 商品コード; -- 顧客ごと、かつ、商品ごとに集計
HAVING
句は、GROUP BY
句によってグループ化された結果に対して、さらに条件を指定して絞り込むために使用します。WHERE
句が個別のレコードに適用されるのに対し、HAVING
句はグループ化された後の集計結果に適用されます。
- 基本的な構文:
sql
SELECT グループ化フィールド, 集計関数(フィールド)
FROM ...
WHERE ... -- 省略可能
GROUP BY グループ化フィールド
HAVING 条件式; -- 集計結果に対する条件 - 例: 合計受注金額が100,000円を超える顧客のみを抽出する
sql
SELECT 顧客ID, SUM(金額) AS 合計金額
FROM 受注データ
GROUP BY 顧客ID
HAVING SUM(金額) > 100000;
第5章:アクションクエリに対応するSQL
選択クエリだけでなく、データを変更するアクションクエリもSQL文で記述・実行できます。アクションクエリは実行するとデータが実際に変更されるため、実行前に必ずバックアップを取るか、事前に選択クエリで対象となるレコードを確認することを強くお勧めします。Accessではアクションクエリを実行する際に警告が表示されますが、SQLビューから実行する場合も同様に警告が表示されます。
5.1. 追加クエリ (INSERT INTO)
あるテーブルから別のテーブルにレコードを追加します。
- 構文1:値を直接指定して1件追加
sql
INSERT INTO 挿入先テーブル名 (フィールド1, フィールド2, ...)
VALUES (値1, 値2, ...);- フィールドリストと値リストのフィールド数と順序、データ型が一致している必要があります。
- AutoNumber型のフィールドはリストに含めず、データベースに自動生成させます。
- NULL値を挿入する場合は
NULL
と指定します。 - テキスト値は
'
(シングルクォーテーション) で囲みます。日付値は#
(シャープ) で囲みます。数値はそのまま記述します。
- 構文2:他のテーブル/クエリの結果を追加
sql
INSERT INTO 挿入先テーブル名 (フィールド1, フィールド2, ...)
SELECT フィールドA, フィールドB, ...
FROM 抽出元テーブル名 または クエリ名
WHERE 条件; -- 抽出元から挿入するレコードを絞り込む条件INSERT INTO
句のフィールドリストとSELECT
句のフィールドリストのフィールド数と順序、データ型が一致している必要があります。- この構文がAccessで追加クエリを作成する際の一般的です。
例: 「アーカイブ顧客」テーブルに「顧客マスター」から特定の条件(例えば最終購入日が1年以上前)の顧客を追加する。
sql
INSERT INTO アーカイブ顧客 (顧客ID, 顧客名, 最終購入日)
SELECT 顧客ID, 顧客名, 最終購入日
FROM 顧客マスター
WHERE 最終購入日 < DateAdd("yyyy", -1, Date()); -- Access関数 DateAddとDateを使用
DateAdd("yyyy", -1, Date())
は、今日の日付から1年前の日付を計算するAccess VBA/SQL関数です。SQLビューではこのようなAccess固有の関数も使用できます。
5.2. 更新クエリ (UPDATE)
テーブル内の既存のレコードの値を変更します。
- 構文:
sql
UPDATE テーブル名
SET フィールド1 = 新しい値1, フィールド2 = 新しい値2, ...
WHERE 条件; -- 更新対象のレコードを絞り込む条件WHERE
句を省略すると、テーブル内のすべてのレコードが更新されます。新しい値
には、定数、他のフィールドの値、計算式、関数などが指定できます。
例: 担当者が「佐藤」で、状態が「処理中」の受注レコードの担当者を「田中」に変更する。
sql
UPDATE 受注データ
SET 担当者 = '田中'
WHERE 担当者 = '佐藤' AND 状態 = '処理中';
例: 商品リストテーブルで、カテゴリが「文具」の商品の単価を10%値上げする。
sql
UPDATE 商品リスト
SET 単価 = 単価 * 1.10
WHERE カテゴリ = '文具';
5.3. 削除クエリ (DELETE FROM)
テーブルからレコードを削除します。
- 構文:
sql
DELETE FROM テーブル名
WHERE 条件; -- 削除対象のレコードを絞り込む条件WHERE
句を省略すると、テーブル内のすべてのレコードが削除されます。これは非常に危険な操作なので注意が必要です。
例: 状態が「キャンセル」の受注レコードを削除する。
sql
DELETE FROM 受注データ
WHERE 状態 = 'キャンセル';
例: 「アーカイブ顧客」テーブルから、最終更新日が5年以上前のレコードを削除する。
sql
DELETE FROM アーカイブ顧客
WHERE 最終更新日 < DateAdd("yyyy", -5, Date());
5.4. テーブル作成クエリ (SELECT INTO)
クエリの結果を基に新しいテーブルを作成します。
- 構文:
sql
SELECT フィールド1, フィールド2, ...
INTO 新しいテーブル名
FROM 抽出元テーブル名 または クエリ名
WHERE 条件; -- 抽出元から新しいテーブルに含めるレコードを絞り込む条件INTO 新しいテーブル名
句を追加することで、通常のSELECT
クエリがテーブル作成クエリになります。- 新しいテーブルのフィールド名とデータ型は、
SELECT
句で指定したフィールドから引き継がれます。
例: 2023年度の受注データを抽出して「2023年度受注集計」という新しいテーブルを作成する。
sql
SELECT 顧客ID, 商品コード, SUM(数量) AS 合計数量, SUM(金額) AS 合計金額
INTO 2023年度受注集計
FROM 受注データ
WHERE 受注日 BETWEEN #2023/04/01# AND #2024/03/31#
GROUP BY 顧客ID, 商品コード;
この例では、抽出と同時に集計も行い、その集計結果を新しいテーブルに格納しています。
第6章:SQLビューでの高度なテクニック
基本的なSQLコマンドに加えて、より複雑なデータ操作を行うためのテクニックをSQLビューで実現する方法について解説します。
6.1. テーブルの結合 (JOIN)
FROM
句で複数のテーブルやクエリを結合して、関連するデータを組み合わせて抽出します。クエリデザイナーでテーブル間のリレーションシップ線を作成することに対応します。
- 内部結合 (INNER JOIN): 結合条件に一致する両方のテーブルのレコードのみを抽出します。これが最も一般的に使用される結合です。
sql
SELECT 顧客マスター.顧客名, 受注データ.受注日, 受注データ.商品コード
FROM 顧客マスター INNER JOIN 受注データ ON 顧客マスター.顧客ID = 受注データ.顧客ID; - 左外部結合 (LEFT JOIN または LEFT OUTER JOIN):
FROM
句で先に記述したテーブル(左テーブル)のすべてのレコードを含め、結合条件に一致する右テーブルのレコードを結合します。一致しない場合は、右テーブルのフィールドはNULLになります。
sql
SELECT 顧客マスター.顧客名, 受注データ.受注日
FROM 顧客マスター LEFT JOIN 受注データ ON 顧客マスター.顧客ID = 受注データ.顧客ID;
このクエリは、受注がある顧客はもちろん、受注が一度もない顧客も含めて顧客名を抽出します。受注がない顧客の場合、受注日フィールドはNULLになります。 - 右外部結合 (RIGHT JOIN または RIGHT OUTER JOIN):
FROM
句で後に記述したテーブル(右テーブル)のすべてのレコードを含め、結合条件に一致する左テーブルのレコードを結合します。一致しない場合は、左テーブルのフィールドはNULLになります。Access SQLでは、内部的には左外部結合に変換されます(RIGHT JOIN TableA ON ...
はFROM TableB LEFT JOIN TableA ON ...
と同じ意味になります)。
sql
SELECT 顧客マスター.顧客名, 受注データ.受注日
FROM 受注データ RIGHT JOIN 顧客マスター ON 受注データ.顧客ID = 顧客マスター.顧客ID; -- これは LEFT JOIN 受注データ ON ... と同じ - 完全外部結合 (FULL OUTER JOIN): Accessの標準SQLでは直接サポートされていません。両方のテーブルのすべてのレコードを含め、一致しない場合はNULLになります。Accessでこれを実現するには、左外部結合と右外部結合の結果を
UNION
で結合するなどの方法を取る必要があります。
複数のテーブルを結合する場合、括弧 ()
を使用して結合の優先順位を明確にすることをお勧めします。
sql
SELECT 顧客マスター.顧客名, 受注データ.受注日, 商品リスト.商品名
FROM (顧客マスター INNER JOIN 受注データ ON 顧客マスター.顧客ID = 受注データ.顧客ID)
INNER JOIN 商品リスト ON 受注データ.商品コード = 商品リスト.商品コード;
この例では、まず顧客マスターと受注データを結合し、その結果と商品リストを結合しています。
6.2. 副クエリ (Subquery)
別のSQLクエリの内部に含まれるクエリのことを副クエリ(またはネストされたクエリ)と呼びます。副クエリは括弧 ()
で囲んで記述し、主に以下の場所で使用できます。
- WHERE句での使用 (条件指定): 最も一般的な使い方です。副クエリの結果を使って、外部クエリのレコードを絞り込みます。
- 例: 特定のカテゴリの商品を受注した顧客のリストを取得する。
sql
SELECT 顧客ID, 顧客名
FROM 顧客マスター
WHERE 顧客ID IN (SELECT 顧客ID FROM 受注データ WHERE 商品コード IN (SELECT 商品コード FROM 商品リスト WHERE カテゴリ = '電化製品'));
この例では、まず商品リストからカテゴリが電化製品の商品コード
を副クエリで取得し、次に受注データからその商品コード
を含む顧客ID
を別の副クエリで取得し、最後に顧客マスターから該当する顧客ID
のレコードを抽出しています。 - 単一の値を返す副クエリは、比較演算子 (
=
,>
,<
など) と組み合わせて使用できます。
sql
SELECT 商品名, 単価
FROM 商品リスト
WHERE 単価 > (SELECT AVG(単価) FROM 商品リスト); -- 平均単価より高い商品
- 例: 特定のカテゴリの商品を受注した顧客のリストを取得する。
- FROM句での使用 (派生テーブル): 副クエリの結果を一時的なテーブル(派生テーブル)として扱い、さらに外部クエリで処理を行います。
- 例: 各顧客の合計受注金額を計算し、さらにその結果を顧客マスターと結合して顧客名を表示する。
sql
SELECT C.顧客名, 売上集計.合計金額
FROM 顧客マスター AS C INNER JOIN (SELECT 顧客ID, SUM(金額) AS 合計金額 FROM 受注データ GROUP BY 顧客ID) AS 売上集計 ON C.顧客ID = 売上集計.顧客ID;
ここでは、SELECT 顧客ID, SUM(金額) AS 合計金額 FROM 受注データ GROUP BY 顧客ID
という副クエリが、売上集計
という別名を持つ一時的なテーブルとして扱われ、顧客マスターテーブル(C
という別名をつけています)と結合されています。
- 例: 各顧客の合計受注金額を計算し、さらにその結果を顧客マスターと結合して顧客名を表示する。
- SELECT句での使用 (スカラー副クエリ): 外部クエリの各行に対して、単一の値を返す副クエリを実行し、その値をフィールドとして表示します。
- 例: 各顧客に対して、その顧客の総受注数を表示する。
sql
SELECT 顧客ID, 顧客名, (SELECT COUNT(*) FROM 受注データ WHERE 受注データ.顧客ID = 顧客マスター.顧客ID) AS 総受注数
FROM 顧客マスター;
この副クエリは、外部クエリの現在の行の顧客ID
と同じ顧客ID
を持つ受注データの数を数え、その結果が各顧客の行に表示されます。
- 例: 各顧客に対して、その顧客の総受注数を表示する。
副クエリは複雑なクエリを作成する上で非常に強力ですが、多用しすぎるとクエリのパフォーマンスに影響を与える可能性があるため、使用には注意が必要です。
6.3. パラメータークエリ
実行時にユーザーに値を入力させるクエリをパラメータークエリと呼びます。SQLビューでは、WHERE
句などで条件値として[]
で囲んだプロンプトメッセージを記述することでパラメータークエリを作成できます。
- 構文:
sql
SELECT ...
FROM ...
WHERE フィールド名 = [プロンプトメッセージ]; - 例: 入力された顧客IDの受注データを抽出する。
sql
SELECT 受注日, 商品コード, 数量, 金額
FROM 受注データ
WHERE 顧客ID = [検索したい顧客のIDを入力してください];
このクエリを実行すると、「検索したい顧客のIDを入力してください」というメッセージが表示され、ユーザーが入力した値で抽出が行われます。 - パラメーターは複数指定できます。
- 日付型のパラメーターを指定する場合は、Accessが自動的に
#
で囲んで処理してくれます。
sql
WHERE 受注日 BETWEEN [開始日を入力] AND [終了日を入力]; - Like演算子と組み合わせて部分一致検索のパラメーターにすることも可能です。
sql
WHERE 顧客名 LIKE [検索したい顧客名のキーワードを入力] & '*'; -- 入力値で始まる顧客名
Access SQLでは文字列連結に&
を使用します。
6.4. アクセス固有の関数と機能
Access SQLでは、標準SQLにはないAccess独自の関数や機能を使用できる場合があります。例えば、以下のようなものがあります。
- Nz関数: Null値を別の値に変換します。
Nz([フィールド名], 0)
は、フィールドがNullなら0を返し、そうでなければフィールドの値自身を返します。計算フィールドや集計関数と組み合わせてよく使用されます。 - 日付/時刻関数:
Date()
,Now()
,Year()
,Month()
,Day()
,DatePart()
,DateAdd()
,DateDiff()
など、日付や時刻を操作する豊富な関数が利用できます。 - 文字列関数:
Left()
,Right()
,Mid()
,Len()
,InStr()
など。 - ドメイン集計関数 (DLookup, DSum, DCountなど): クエリの対象以外のテーブルやクエリから単一の集計値を取得するのに使用できますが、パフォーマンスに影響する可能性があるため、可能な場合はJoinや副クエリで代替することを検討します。
これらの関数をSQLビューで活用することで、より複雑なデータ処理が可能になります。
第7章:様々なクエリタイプとSQLの関連性
章の冒頭で述べた様々なクエリタイプが、どのようにSQL文と対応しているかを改めて確認します。SQLビューは、これらのクエリがどのようなSQL文で定義されているかを確認できる場所です。
- 選択クエリ:
SELECT ... FROM ... [WHERE ...] [GROUP BY ...] [HAVING ...] [ORDER BY ...];
という基本的な構造を持つSQL文です。 - 追加クエリ:
INSERT INTO ... SELECT ... FROM ... [WHERE ...];
またはINSERT INTO ... VALUES (...);
という構造を持つSQL文です。デザインビューで追加クエリの種類を選択すると、SQLビューはこの形式に切り替わります。 - 更新クエリ:
UPDATE ... SET ... [WHERE ...];
という構造を持つSQL文です。デザインビューで更新クエリの種類を選択すると、SQLビューはこの形式に切り替わります。 - 削除クエリ:
DELETE FROM ... [WHERE ...];
という構造を持つSQL文です。デザインビューで削除クエリの種類を選択すると、SQLビューはこの形式に切り替わります。 - テーブル作成クエリ:
SELECT ... INTO 新しいテーブル名 FROM ... [WHERE ...] [GROUP BY ...] [HAVING ...];
という構造を持つSQL文です。デザインビューでテーブル作成クエリの種類を選択すると、SQLビューはこの形式に切り替わります。 - クロス集計クエリ: 特殊な構文
TRANSFORM 集計関数(集計対象フィールド) SELECT 行見出しフィールド FROM ... GROUP BY 行見出しフィールド PIVOT 列見出しフィールド;
を使用します。デザインビューでクロス集計クエリの種類を選択すると、SQLビューはこの形式に切り替わります。この構文はAccess固有であり、他のデータベースでは通常サポートされていません。 - 集合クエリ: 複数の
SELECT
文をUNION
またはUNION ALL
で結合した構造を持ちます。SELECT ... UNION [ALL] SELECT ... [UNION [ALL] SELECT ...];
です。UNION
は重複行を排除しますが、UNION ALL
は重複行を含めて結合します(一般的にUNION ALL
の方が高速です)。デザインビューには集合クエリ専用のモードはありません。集合クエリを作成するには、まず一つ目の選択クエリをデザインビューまたはSQLビューで作成し、それをSQLビューに切り替えてUNION
句以降のSQL文を追加していくのが一般的です。 - パススルー クエリ: Accessのデータソースに依存せず、ODBC接続などを介して外部データベースにSQL文をそのまま送信します。SQLビューには外部データベースのSQL構文(例えばSQL ServerのT-SQLなど)を記述します。Accessの機能(例: Access固有関数、パラメータークエリの
[]
構文など)の一部は使用できない場合があります。デザインビューはありません。 - データ定義クエリ:
CREATE TABLE ...
,ALTER TABLE ...
,DROP TABLE ...
,CREATE INDEX ...
などのDDL (Data Definition Language) 文を記述します。デザインビューはありません。
このように、SQLビューはAccessのあらゆるクエリタイプの基盤となるSQL文を確認・編集するための統一的なインターフェースを提供します。
第8章:SQLビュー利用時の注意点とトラブルシューティング
SQLビューは強力なツールですが、使用する上でいくつかの注意点があります。
- 構文エラー: SQL文の記述に誤りがあると、クエリの実行時やデザインビューへの切り替え時にAccessがエラーメッセージを表示します。エラーメッセージは構文エラーの場所を示唆してくれることが多いですが、必ずしも正確でない場合もあります。SQL文を少しずつ記述・実行して、どこでエラーが発生するかを確認しながら進めるのが効果的です。予約語の誤用、フィールド名やテーブル名のスペルミス、括弧や句読点の不足・間違いなどが一般的なエラーの原因です。
- AccessによるSQLの自動整形: 前述の通り、SQLビューで記述したSQL文は、ビューを切り替える際にAccessによって自動的に整形されることがあります。特に複雑なJOINや副クエリを含む場合、意図しない括弧が付加されたり、改行やインデントが変わったりすることがあります。これは機能に影響はありませんが、自分が記述したSQLが見慣れない形に変わることに注意してください。
- データ型の一致:
WHERE
句やJOIN
条件などでフィールドを比較する場合、データ型が一致している必要があります。例えば、数値型フィールドをテキスト文字列と比較したり、日付型フィールドを数値と比較したりすると、エラーになったり意図しない結果になったりします。日付リテラルを#
で囲むなど、Access SQLのデータ型ルールに従って記述してください。 - アクションクエリの実行: アクションクエリ(追加、更新、削除、テーブル作成)は、実行するとデータが実際に変更されます。SQLビューから実行する場合も、Accessから警告メッセージが表示されます。必ず実行前に内容をよく確認し、必要に応じてバックアップを取るようにしてください。特に
WHERE
句を忘れた更新・削除クエリは、全レコードに影響するため非常に危険です。 - パフォーマンス: 非常に大規模なテーブルに対して複雑なSQLクエリを実行すると、処理に時間がかかる場合があります。特に副クエリの多用や、インデックスが適切に設定されていないフィールドでの抽出・結合はパフォーマンスを低下させる可能性があります。必要に応じてテーブルにインデックスを追加したり、クエリの構造を見直したりすることを検討してください。
- 予約語: Access SQLや標準SQLの予約語(SELECT, FROM, WHERE, UPDATEなど)をフィールド名やテーブル名に使用することは避けるべきです。もし使用してしまった場合は、SQL文中で
[]
で囲む必要があります。 - NULL値の扱い:
WHERE
句でのNULL値の判定はIS NULL
またはIS NOT NULL
を使用する必要があります(= NULL
や<> NULL
は機能しません)。集計関数によってはNULL値を無視するもの(SUM, AVG, COUNT(フィールド名))と、NULL値を含む行を数えるもの(COUNT(*))があります。
第9章:まとめ:クエリデザイナー vs. SQLビュー
最後に、クエリデザイナーとSQLビューのそれぞれの利点と、どちらを使用するのが適切かについてまとめます。
クエリデザイナーの利点:
- 直感的で分かりやすい: 視覚的な操作でクエリを作成・編集できるため、SQLの知識がなくても利用できます。
- 迅速な作成: シンプルな選択クエリや基本的な結合、抽出条件の設定は、デザイナーを使う方が素早く行えます。
- エラーの発見: フィールドの選択やテーブルの結合など、基本的な構文エラーを未然に防ぎやすいです。
- アクションクエリへの切り替え: デザインビューでボタン一つでアクションクエリ(追加、更新、削除、テーブル作成)に切り替え、必要な設定項目が表示されるため便利です。
- クロス集計クエリ: クロス集計クエリは、デザイナーの専用モードを使う方が構造を理解しやすく、作成しやすいです。
SQLビューの利点:
- 柔軟性と表現力: クエリデザイナーでは難しい、あるいは不可能な複雑なクエリ(副クエリ、複雑なJOIN条件、UNIONクエリなど)を自由に記述できます。
- 詳細な制御: クエリの各要素(句)を完全にコントロールし、細部にわたる調整が可能です。
- SQLの学習: 既存クエリのSQLを確認したり、自分でSQL文を記述したりすることで、SQLスキルを習得できます。これはAccessだけでなく、他のデータベースシステムを扱う上でも役立ちます。
- メンテナンス: 作成されたSQL文をテキストとして管理できるため、クエリの定義を他の人に伝えたり、異なるシステムに移植したりする際に便利です(ただしAccess固有の構文には注意が必要)。
- パススルー クエリ/データ定義クエリ: これらの特殊なクエリはSQLビューでしか作成できません。
使い分けの推奨:
- AccessやSQLの初心者: まずはクエリデザイナーを使って基本的なクエリの作成に慣れるのが良いでしょう。デザイナーで作成したクエリをSQLビューで開き、どのようなSQL文が生成されるのかを確認することから始めるのが、SQL学習の第一歩としてお勧めです。
- 基本的なクエリ: テーブルをいくつか結合してデータを抽出し、簡単な条件で絞り込み、並べ替える程度のクエリであれば、クエリデザイナーで十分かつ効率的に作成できます。
- 複雑なクエリ、高度な機能: 副クエリ、複雑な多重結合、UNIONクエリ、Access固有関数を多用する場合、あるいはパススルー クエリやデータ定義クエリを作成する必要がある場合は、SQLビューを使用します。
- クエリの微調整: クエリデザイナーで大枠を作成し、SQLビューに切り替えて細かい条件や句を追加・修正するという使い分けも非常に効果的です。
SQLビューは、Accessのクエリ機能を深く理解し、より高度なデータ操作を行うための扉を開きます。最初は難しく感じるかもしれませんが、基本的なSQLコマンドから始め、少しずつ複雑な構文に挑戦していくことで、確実にスキルアップできます。Accessを使いこなす上で、SQLの知識は強力な武器となります。ぜひSQLビューを活用して、Accessデータベースの可能性を広げてください。