ページの最終校正年月日 :
8. SQL に関してのまとめ

SQL の命令は正確にはステートメント (statement) と呼び、 SQL ステートメントは幾つかの (clause) からなっている。 大文字、小文字のいずれで記述してもよく、C 言語同様に空白は 無視され、ステートメントの最後にはセミコロン ; を書く。

Access ではデザインビューでクエリを作成してから、「SQL ビュー」 で生成される「SQL ステートメント」を確認してきたが、「SQL ビュー」 には直接「SQL ステートメント」を書き込むことができる。 「デザインビューでクエリを作成する」を選んで、「テーブルの表示」で 何もテーブルを選択しないでおいて、「SQL ビュー」に移動してから、 直接「SQL ステートメント」を書き込むことができ、 ファイル名をつけて保存することができる。以後クエリをマウスで指定してから、 メニューの「デザイン」を選択すれば、「SQL ビュー」の画面になり、 修正が可能となる。

SQL のステートメントには色々なものがあるが、 今までに登場した主なものは次のものである。

  Access での主な生成方法
select選択クエリ
update更新クエリ
insert追加クエリ
delete削除クエリ

以上以外にも特殊な「クロス集計クエリ」も扱いましたが、こちらの SQL ステートメントは少し複雑ですから除外することにして、 上に述べたものをもう少し整理をすることにします。

SELECT

select は次の構文で使用されていました。

SELECT ....
FROM .....
WHERE ....
GROUP BY ...
HAVING ....
ORDER BY ....
SELECT

select に続く部分 (句, clause) には、テーブルのフィールドを列挙する。

SELECT フィールド名1, フィールド名2, ...
FROM テーブル名;

なおテーブルのフィールド名を厳密に指定するには 「テーブル名 + ドット + フィールド名」 とする :

テーブル名.フィールド名
FROM

from に続く部分 (句、clause) には、単にテーブルを書いてもよいが、 リレーションシップによってテーブルを結合してもよい。

SELECT 名簿テーブル.学生番号, 名簿テーブル.氏名, 科目Aテーブル.成績
FROM 名簿テーブル INNER JOIN 科目Aテーブル ON 名簿テーブル.学生番号 = 科目Aテーブル.学生番号;

上の構文は 「名簿テーブル」の「学生番号」フィールドと「科目Aテーブル」の「学生番号」フィールド が同一である場合のみを含める場合である。(INNER JOIN)

テーブルの結合方法には INNER JOIN 以外にも

がある。(「リレーションシップ」参照)

WHERE

where に続く部分には検索条件を書く。完全一致の場合には 等号 = によって指定するが、 ワイルドカード * を使用する場合には LIKE を 指定する。ワイルドカードは文字列の前後に指定できる。

SELECT tblAddress.氏名, tblAddress.郵便番号, tblAddress.都道府県, tblAddress.市区郡
FROM tblAddress
WHERE (((tblAddress.都道府県)="奈良県"));
SELECT tblAddress.氏名, tblAddress.郵便番号, tblAddress.都道府県, tblAddress.市区郡
FROM tblAddress
WHERE (((tblAddress.都道府県) Like "奈良*"));

WHERE 以後の条件式には次のようなものが使用可能

なお Access で生成される SQL ステートメントでは文字列はダブルクォーツ " 囲まれているが、本来の SQL ステートメントでは文字列はシングルクォーツ ' で囲む。

GROUP BY

group by に続く部分に記述するのは, 集計のときに使用するグループ化である。

SELECT 家計簿.品目, Sum(家計簿.費用) AS 費用の合計
FROM 家計簿
GROUP BY 家計簿.品目;

上の SQL 文 (statement) は「家計簿」テーブルの「品目」フィールドの 同一品目ごとに「費用」フィールドの「合計」を計算するものであった。 (「集計」を参照) なお select に続く部分には「集計」することによって 新規に作成されるフィールド「費用の合計」を as によって指定できることも分かる。

HAVING

having に続く部分には「集計」の場合の 検索条件を書く。

SELECT 家計簿.品目, Sum(家計簿.費用) AS 費用の合計
FROM 家計簿
GROUP BY 家計簿.品目
HAVING (((家計簿.品目)="雑誌"));

from に続く検索条件は where で指定したが、 group by に続く検索条件は having で指定するのである。 類似した構文である。

ORDER BY

order by に続く部分には、並べ替えを指定する。 「降順」の場合には次のように書く。(DESC は descent (降順) の省略)

SELECT フィールド名1, フィールド名2, ...
FROM テーブル名
ORDER BY フィールド名 DESC;

昇順の場合は次のように書く。(ASC は ascent (降順) の省略であるが、これは あえて書く必要はない。)

SELECT フィールド名1, フィールド名2, ...
FROM テーブル名
ORDER BY フィールド名 ASC;
UPDATE

update (更新) に関しては、「更新クエリ」で次のような SQL ステートメントを生成した。

UPDATE 科目Aテーブル SET 科目Aテーブル.成績 = [成績]*1.1;

本来の SQL ステートメントでは

UPDATE 科目Aテーブル SET 科目Aテーブル.成績 = 科目Aテーブル.成績 * 1.1;

でよいはずだが、「SQL ビュー」で作成して、保存し、再度コードを見てみると

UPDATE 科目Aテーブル SET 科目Aテーブル.成績 = [科目Aテーブル].[成績] * 1.1;

のように変更されている。Access ではフィールド名と演算子とを両立させるためには、 フィールド名を角カッコ [ ] でくくる必要があるようである。 なお

UPDATE 科目Aテーブル SET 科目Aテーブル.成績 = 100;

とすると、全員の成績が 100 になる。

INSERT

insert (追加) に関しては、「追加クエリ」で次のような SQL ステートメント を生成した。

INSERT INTO 名簿テーブル ( 学生番号, 氏名 )
SELECT 名簿テーブル2.学生番号, 名簿テーブル2.氏名
FROM 名簿テーブル2;

insert の基本的な構文は次である。

INSERT INTO テーブル名
( フィールド名1, フィールド名2, ... )
VALUES( 値1, 値2, ... )

上の実例は、この values による値の指定に select 文を指定したものである。

DELETE

delete (削除) に関しては「削除クエリ」では次のような SQL ステートメントを生成した。

DELETE 名簿テーブル.学生番号, 名簿テーブル.氏名, Val([学生番号])
FROM 名簿テーブル
WHERE (((Val([学生番号]))>="30"));

Val は Visual Basic の文字列を数値に変更する変更するコマンドである。 Access の SQL でも使用が可能なようである。次でも正常に動作する。

DELETE 名簿テーブル.学生番号, 名簿テーブル.氏名
FROM 名簿テーブル
WHERE Val([学生番号])>=30;

なお delete の基本的な構文は次の形である。

DELETE フィールド名1, フィールド名2, ... 
FROM テーブル名
WHERE 検索条件;