Access学習メモ 7-2. SQL基礎学習②

Access学習メモ 7-2. SQL基礎学習②

コンテンツ
学び
データベースのテーブル全フィールドの内、特定フィールドを表示したいときに用いられる、標準的なデータ取得SQLです。

SELECT
テーブル名.[1つ目の指定フィールド名],
テーブル名.[2つ目の指定フィールド名], 
テーブル名.[3つ目の指定フィールド名]
FROM テーブル名;
7-2.SOL基礎学習 クエリ.png

1. SQLの構造
7-1.SQL基礎学習①と同じく、ここでもふたつの「句」が登場する。

SELECT 句:
SELECT
M_配信リスト.[話数], 
M_配信リスト.[タイトル], 
M_配信リスト.[放送日], 
M_配信リスト.[Season]

役割:どの列(フィールド)のデータを取得するかを指定
詳細:
テーブル名「M_配信リスト」
前回のように全フィールドを一括取得する場合、*(アスタリスク)を用いた命令句が成立するが、一部のフィールドのみ取得する場合においては、具体的なフィールド名をカンマ(,)で区切って「どのテーブルの、どの項目か」を正確に指定する必要がある。
今回はテーブル名「M_配信リスト」の内、[タイトル][放送日][Season]フィールドを表示。

FROM 句:
FROM M_配信リスト;
役割:データの取得元となるテーブルを指定
詳細:
「M_配信リスト」テーブルからデータを取るように指定。
末尾の ;(セミコロン)は、SQL文の終わりを示す。

2. 本SQLの役割
「M_配信リスト」テーブルに格納されたすべてのレコード(行)の内、指定した項目(列)を抽出して表示。

補足:「フィールド名」の[](角かっこ)の意味
「プログラムの命令(予約語)の内、ここからここまでが名称」と固有名詞の存在をAccessに伝えるための境界線。
一方、クエリのデザイングリッドでSQLを組む場合、Accessが自動形成してくれるコードにはフィールド名に[]が含まれていなかったり、あるいは[]ありと[]なしが混在しているケースがある。

Accessが「命令の一部なのか、名称なのか区別がつかない箇所」を検出し最適化が行われた結果、必要と判断された部分にのみ角カッコが付与される様子。

試しにフィールド名[放送日]を[放送日(西暦)]とし、※括弧を入れる
新たなフィールド名[Select]を追加してみた。※予約語と重複した名称

AccessにSQLを自動形成させると
フィールド名;話数とSeason以外には、すべて[]が自動付与された模様。
7-2.SOL基礎学習 dummy.png

SELECT M_配信リスト.話数, 
M_配信リスト.[タイトル], 
M_配信リスト.[放送日(西暦)], 
M_配信リスト.Season, M_配信リスト.[Select]
FROM M_配信リスト;

[]が必要になりやすいフィールド名の例
名前にスペースや記号が含まれる場合: [円 税込][円(税込)]
名前が数字から始まる場合: [2026年度売上]
「予約語」と同じ名前の場合:[Select]

3. カンマ(,)のルール
複数フィールドを並べる時は、必ず間にカンマを入れる。
ただし、末尾のフィールドの後ろにはカンマを残さないよう注意。
OK: フィールドA, フィールドB
NG: フィールドA, フィールドB ←ここ

4. 改行の必要性
Accessクエリ自動形成による改行なしバージョンと改行を施したバージョンで比較したが、命令句の効果は変わらない。
改行なし
7-2.SOL基礎学習 改行なし.png

改行あり(ついでに角カッコ付与)
7-2.SOL基礎学習改行.png

5.VBAコードの中でSQLを用いる場合
VBAにとってSQLは「単なる文字列」として扱われるため注意は必要だが、
SQLとしてのルールは共通。

①SQL単独使い:
SELECT ID FROM Table
②VBA内のSQL: 
strSQL = "SELECT ID FROM Table" 

①②どちらも正常に動作する。
VBAに入れた瞬間に文法が変わるわけではない。
ではなぜ、VBA内SQLでは角カッコ付き名称が定番なのか?

予約語との衝突リスク:
VBAでSQLを扱う際に特有の「デバッグ(間違い探し)の難しさ」がある。
角カッコがないことで、「SQLのフィールド名」なのか「VBA自身への命令(予約語)」なのかをAccessが読み間違える可能性が高くなる。

文字列結合による混乱: 
strSQL = "SELECT " & myField & " FROM ..." のように、VBA上では「変数」を組み合わせたSQLを用いるケースも多い。
【例】myField = "[タイトル]"
※上記「myField」を「変数」と呼ぶ。
strSQL = "SELECT " & myField & " FROM M_配信リスト" 

変数(myField)の中身を書き換えるだけで、取得フィールドを[タイトル]から[放送日]に変更するなど、プログラムを動かしつつ柔軟な対処が可能になる。
変数はいわばデータを格納するための箱であり、""など文法が複雑化する。可読性の意味でも、あらかじめ角カッコを付けておくことで、変数の中身(""内)にスペースが混在しプログラムが停止するようなトラブルを回避しやすい。

AccessクエリによるSQL自動形成に頼らず自身でVBAコードを書く際は、
フィールド名には一貫して角カッコを付けるほうが安全。


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す