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のクセを理解して、デザインビューもうまく活用しながら、快適なデータベース作業を楽しんでくださいね!
広告
