【1】Accessのファイル「SampleDB4.mdb」を起動し、「SQL練習」のSQLビュー画面を開いてください。
【2】以下のSQL文をくらべてみましょう。各SQL文を貼り付け、実行ボタン「!」をクリックします。データシートビューで見ると同じ結果になります。
・Accessが自動で作成したもの
SELECT T07Slip.SLIP_CD, T07Slip.SLIP_DATE, T07Slip.CST_CD, T04Customer.CST_NAME, T05Sex.SEX, "〒" & [ZIP_CODE] & " " & [PREF_NAME] & [CITY_NAME] & [TOWN_NAME] & [ADDRESS] AS ADDRESS2
FROM ((((T07Slip INNER JOIN T04Customer ON T07Slip.CST_CD = T04Customer.CST_CD) INNER JOIN T05Sex ON T04Customer.SEX_CD = T05Sex.SEX_CD) INNER JOIN T03Town ON T04Customer.TOWN_CD = T03Town.TOWN_CD) INNER JOIN T02City ON T03Town.CITY_CD = T02City.CITY_CD) INNER JOIN T01Prefecture ON T02City.PREF_CD = T01Prefecture.PREF_CD
ORDER BY T07Slip.SLIP_CD;
・修正したもの
SELECT SLIP_CD, SLIP_DATE, T07Slip.CST_CD, CST_NAME, SEX, "〒" & ZIP_CODE & " " & PREF_NAME & CITY_NAME & TOWN_NAME & ADDRESS AS ADDRESS2
FROM T07Slip,T04Customer,T05Sex,T03Town,T02City,T01Prefecture
WHERE T07Slip.CST_CD = T04Customer.CST_CD
AND T04Customer.SEX_CD = T05Sex.SEX_CD
AND T04Customer.TOWN_CD = T03Town.TOWN_CD
AND T03Town.CITY_CD = T02City.CITY_CD
AND T02City.PREF_CD = T01Prefecture.PREF_CD
ORDER BY T07Slip.SLIP_CD;
結果は同じですが、2つのSQL文には大きな違いがあります。
【3】次は各SQL文を「SQL練習」のデザインビューで見てください。
・Accessが自動で作成したもの
Accessが自動で作成したものはテーブル同士の結合にINNER JOINが使われているため、線で結ばれています。
・修正したもの
修正したものは線で結ばれる代わりに抽出条件に何か書かれています。実はこの部分がWHEREにあたります。
例えばテーブルT07SlipのCST_CD抽出条件に [T04Customer].[CST_CD] と書かれています。これは「T07SlipのCST_CD」と 「T04CustomerのCST_CD」で条件の一致するレコードを抽出するという意味です。PREF_CD、CITY_CD、TOWN_CD、SEX_CDについても同様です。
【解説】
Accessが自動で作成したSQL文は、INNER JOINが使われているため、FROM部分がとても複雑になっています。テーブル名と抽出条件が同時に書かれているためです。
しかもフィールド名が完全に「テーブル名.フィールド名」のかたちで指示されていて、冗長化されています。そのかわりクエリのデザインビューで見るとシンプルです。
INNER JOINは内部結合ともいわれ、条件の一致するレコードを抽出します。2つくらいのテーブルならそれほど難しくないです。下記なら何とか分かると思います。
T07Slip INNER JOIN T04Customer
ON T07Slip.CST_CD = T04Customer.CST_CD
しかしINNER JOINはテーブル数が増えると、入れ子になって初心者には難しくなります。入れ子とは入れ物の中に入れ物があり、さらにその中に入れ物が・・・という感じの構造です。つまり括弧がいっぱい出てきます。
どこまでが一組の()括弧か非常にわかりにくいです。INNER JOINの入れ子状態を分かりやすく書くとこんな感じです。
(
(
(
(
T07Slip INNER JOIN T04Customer ON T07Slip.CST_CD = T04Customer.CST_CD
) INNER JOIN T05Sex ON T04Customer.SEX_CD = T05Sex.SEX_CD
) INNER JOIN T03Town ON T04Customer.TOWN_CD = T03Town.TOWN_CD
) INNER JOIN T02City ON T03Town.CITY_CD = T02City.CITY_CD
) INNER JOIN T01Prefecture ON T02City.PREF_CD = T01Prefecture.PREF_CD
逆に修正したものはデザインビューでは複雑ですが、SQL文はシンプルになっています。FROMには使うテーブル名だけを書き、WHEREでテーブル同士の関係をまとめていますので、理解しやすいと思います。
FROM T07Slip,T04Customer,T05Sex,T03Town,T02City,T01Prefecture
WHERE T07Slip.CST_CD = T04Customer.CST_CD
AND T04Customer.SEX_CD = T05Sex.SEX_CD
AND T04Customer.TOWN_CD = T03Town.TOWN_CD
AND T03Town.CITY_CD = T02City.CITY_CD
AND T02City.PREF_CD = T01Prefecture.PREF_CD
もちろん最初から修正したもののようにクエリをデザインすると、Accessは修正したSQL文に近い形で作ってくれます。
冗長化を省いたり、テーブルに別名を使ってSELECTやWHEREをシンプルに書くには、やはり最後は人間の手による修正が必要です。