AccessのSQL文の書き方をお探しですね。

広告

Microsoft Accessを使うなら知っておきたい!標準SQLとは違う独自ルールを徹底解説

Microsoft Accessでデータベースを作っていて、「あれ?いつものSQL文が動かない…」と困ったことはありませんか?実は、Accessの裏側で動いているのは「JETデータベースエンジン(またはACEデータベースエンジン)」という独自のシステムで、MySQLやPostgreSQLといった一般的なデータベースとは、ちょっと違った書き方のルールがあるんです。

この記事では、Accessならではの「ちょっと変わったSQL」について、よく使う「SELECT」「JOIN」「WHERE」「GROUP BY」の4つに絞って、わかりやすく説明していきます。

標準SQLとの違いをしっかり理解すれば、Accessでのクエリ作成がぐっとスムーズになりますよ!

1. SELECT句で気をつけたいAccessのルール

AccessのSELECT句は、基本的な書き方は標準SQLとほぼ同じです。

でも、フィールド名やテーブル名の扱い方に、Access特有のクセがあります。

日本語やスペースが入った名前は「大カッコ[ ]」で囲む

一番よく遭遇するのが、フィールド名に日本語やスペースが含まれている場合です。

標準SQLではダブルクォーテーション(”)やバッククォート(`)で囲むことが多いですが、**Accessでは大カッコ「[ ]」を使う**のが絶対ルールです。

“`sql

SELECT [顧客名], [電話番号] FROM [顧客マスタ]

“`

この大カッコを忘れると、Accessが「パラメーターの値を入力してください」というダイアログを突然表示してきて、「え、何これ?」となることがあります。

日本語名を使うときは、必ず大カッコで囲むクセをつけましょう。

文字列をつなげるには「&」を使う

姓と名を合わせて氏名にしたい、といった文字列の結合も、Accessでは独特です。

標準SQLなら「||」や「CONCAT関数」を使いますが、**Accessでは「&」(アンパサンド)**を使います。

“`sql

SELECT [姓] & [名] AS [氏名] FROM [社員テーブル]

“`

「+」でも結合できるんですが、データにNull(空っぽの値)が混ざっていると、結果全体がNullになってしまうリスクがあります。

なので、文字列をつなげるときは「&」を使うのが安全です。

デザインビューとSQLビューを行き来すると括弧が増える

AccessのクエリデザインビューとSQLビューを何度も切り替えていると、Accessが勝手にSQLを書き換えて、やたらと括弧「()」が増えてしまうことがあります。

特に、IIf関数(標準SQLのCASE文みたいなもの)を使った複雑な式だと、あとから見返したときに「これ、何書いてたんだっけ?」となりがちです。

最初はシンプルなSELECT句から始めて、動作確認しながら少しずつ複雑にしていくのがコツです。

2. JOIN(テーブル結合)が一番のクセ者!

AccessのSQLで一番つまずきやすいのが、複数のテーブルを結合する「JOIN」の書き方です。

ここでエラーが出て、何時間も悩んだ…という人は本当に多いです。

3つ以上のテーブルを結合するときは「丸括弧()」が必須

標準SQLでは、テーブルをいくつ結合しても、

“`sql

FROM テーブルA
INNER JOIN テーブルB ON ...
INNER JOIN テーブルC ON ...

“`

と、そのまま続けて書けます。

でも、**Accessでは3つ以上のテーブルを結合するとき、必ず丸括弧で結合の順番を明示しないといけません**。

“`sql

FROM (テーブルA INNER JOIN テーブルB ON テーブルA.ID = テーブルB.ID)
INNER JOIN テーブルC ON テーブルA.ID = テーブルC.ID

“`

括弧が1つでも足りなかったり、位置がずれていたりすると、「演算子がありません」といった分かりにくいエラーが出て、クエリが動きません。

テーブルが4つ、5つと増えると、括弧の数もどんどん増えていって、もう訳がわからなくなります。

迷ったら「クエリデザインビュー」に頼ろう

この括弧地獄から抜け出す一番簡単な方法は、**Accessのクエリデザインビューを使うこと**です。

複雑な結合を手書きしようとせず、まずはデザインビューでテーブルをマウスで線でつないでみてください。

それからSQLビューに切り替えれば、Accessが正しい括弧付きのJOIN文を自動で作ってくれます。

この自動生成されたSQLをベースに、必要な部分だけ手直しすれば、エラーで悩む時間がぐっと減りますよ。

3. WHERE句の条件指定で知っておくべきこと

データを絞り込むWHERE句にも、Access独自のクセがいくつかあります。

ワイルドカードは「*」と「?」

標準SQLで曖昧検索(LIKE)をするとき、「%」(複数文字)と「_」(1文字)を使いますよね。

でも、**Accessでは「*」(複数文字)と「?」(1文字)**を使います。

“`sql
— 「田」で始まる名前を検索

WHERE [名前] LIKE "田*"

— 「田_郎」のような3文字の名前を検索

WHERE [名前] LIKE "田?郎"

“`

標準SQLのクセで「%」を使ってしまうと、文字通り「%」という記号を検索してしまい、何もヒットしなくて「あれ?」となります。

日付は「#」で囲む

日付を条件に指定するときも、Accessは独特です。

多くのデータベースでは「’2023-01-01’」のようにシングルクォーテーションで囲みますが、**Accessでは「#」(シャープ)で囲みます**。

“`sql

WHERE [登録日] >= #2023/01/01#

“`

この「#」を忘れると、Accessが日付として認識してくれず、エラーになったり、おかしな結果が返ってきたりします。

空白データの判定は「IS NULL」だけじゃ不十分

データが空っぽかどうかを調べるとき、標準SQLと同じく「IS NULL」を使えます。

でも、Accessには「長さゼロの文字列(””)」と「Null」という2種類の空っぽがあるんです。

見た目は同じ空白セルでも、中身が違うことがあります。

完全に空白のデータを探したいときは、両方をチェックする必要があります。

“`sql

WHERE [備考] IS NULL OR [備考] = ""

“`

あるいは、Nz関数を使ってNullを空文字に変換してから判定する、というテクニックもあります。

4. GROUP BYで集計するときの注意点

データをグループ分けして合計や平均を出すGROUP BY句は、基本的なルールは標準SQLと同じです。

SELECT句で指定したフィールドのうち、集計関数(SUMやCOUNTなど)を使っていないものは、すべてGROUP BY句にも書かないといけません。

Access独自の関数を使うと記述が長くなる

Accessでは、標準SQLのCASE文の代わりに「IIf関数」、COALESCE関数の代わりに「Nz関数」を使います。

これらの関数をSELECT句で使って、その結果でグループ化したい場合、GROUP BY句にも同じ関数の記述を繰り返さないといけないことがあります。

他のデータベースなら、SELECT句で定義した別名(エイリアス)をGROUP BY句で使えることが多いんですが、Accessではそれができないケースが多く、SQL文がどんどん長くなってしまいます。

複雑な集計はクエリを分割しよう

Accessのエンジンは、あまりにも複雑なサブクエリや、何重にもネストした集計クエリの実行が苦手です。

1つのSQL文に無理やり詰め込もうとすると、処理に時間がかかりすぎたり、最悪Accessがフリーズしたりすることも。

そんなときは、**処理を複数のクエリに分けるのがおすすめ**です。

1. まず、必要なデータだけを絞り込む「選択クエリ」を作る
2. その選択クエリを元に、GROUP BYで集計する
3. 必要なら、別のクエリで集計結果同士を結合する

Accessでは、1つの巨大なSQLを書くより、シンプルなクエリをいくつか連携させる方が、動作も安定するし、後から修正するのも楽になります。

まとめ

Microsoft Accessは、手軽にデータベースを作れる便利なツールですが、SQL文の書き方には独自のクセがあります。

特に、

– フィールド名は大カッコ「[ ]」で囲む
– 文字列結合は「&」を使う
– 3つ以上のテーブル結合には丸括弧が必須
– ワイルドカードは「*」と「?」
– 日付は「#」で囲む
– 複雑な集計はクエリを分割する

といったポイントを押さえておけば、エラーで悩む時間がぐっと減ります。

最初は戸惑うかもしれませんが、Accessのクセを理解して、デザインビューもうまく活用しながら、快適なデータベース作業を楽しんでくださいね!

広告