主役となるテーブルはどれ?

今回は「どのテーブルが主役か」というお話をします。テーブル数が増え、同じようなデータが入ったフィールドが増えてくると、初心者はどちらのフィールドを使っていいのか混乱します。今のうちに整理しておきましょう。

今回のポイントはズバリ二つです。
・テーブルが増えると主役が変わる
・同じフィールドがある場合は主役側を使う
ということです。

以下はAccessのクエリを使って、テーブルの関係を示した図です。クエリを使うとSQL文を視覚的に理解することができます。

【1】まず「T01Prefecture」だけの場合です。

access-sql147.gif

テーブルが一つなので、もちろん主役はT01Prefectureです。これは大丈夫ですよね。


【2】次は「T01Prefecture」と「T02City」の場合です。

access-sql148.gif

PREF_CDという共通のフィールドがあり、線でつながっています。PREF_CDが二つあるのでSQL文を書くときにどちらを使うか迷います。そんな時は『どちらが主役か』を考えます。

答えを先に言うと主役はT02Cityです。T02Cityだけだと都道府県名が分かりませんので、そのためにT01Prefectureを使っています。もしT02Cityに都道府県名のフィールドがあれば、T01Prefectureは不要です。

しかしAccessのようなリレーショナルデータベースでは、主役側には文字ではなく脇役側に対応する数値を入力し、必要があれば脇役側を参照することになっています。文字より数値のほうが入力ミスは少ないし、データ容量も小さくて済みます。なにより都道府県名に間違いがあった時は、脇役側だけ直せばよいので効率的です。

以上の理由からSELECT部分ではT02City.PREF_CDのほうを使うわけです。

SELECT CITY_CD,T02City.PREF_CD,CITY_NAME,PREF_NAME
FROM T02City,T01Prefecture
WHERE T02City.PREF_CD = T01Prefecture.PREF_CD;

SQL実行結果
access-sql152.gif


【3】次は「T01Prefecture」、「T02City」、「T03Town」の場合です。

access-sql149.gif

PREF_CD、CITY_CDという共通のフィールドがあり、線でつながっています。

この場合主役はT03Townです。T03Townだけだと都道府県名や市町村名が分かりませんので、そのためにT01PrefectureとT02Cityを使っています。もしT03Townに都道府県名や市町村名のフィールドがあれば、T01PrefectureやT02Cityは不要です。

以上の理由からSELECT部分ではT03Town.CITY_CDのほうを使います。主役と脇役をはっきりさせるため、はじめに主役側のフィールドを並べ、そのあとに脇役のフィールドを並べています。

SELECT TOWN_CD,T03Town.CITY_CD,ZIP_CODE,TOWN_NAME,CITY_NAME,PREF_NAME
FROM T03Town,T02City,T01Prefecture
WHERE T03Town.CITY_CD = T02City.CITY_CD
AND T02City.PREF_CD = T01Prefecture.PREF_CD;

SQL実行結果
access-sql153.gif


【4】次は「T01Prefecture」、「T02City」、「T03Town」、「T04Customer」の場合です。

access-sql150.gif

PREF_CD、CITY_CD、TOWN_CDという共通のフィールドがあり、線でつながっています。

この場合主役はT04Customerです。T04Customerだけだと都道府県名、市町村名、地域名、郵便番号が分かりませんので、そのためにT01Prefecture、T02City、T03Townを使っています。もしT04Customerに各情報があれば他のテーブルは不要です。

以上の理由からSELECT部分ではT04Customer.TOWN_CDのほうを使います。

SELECT CST_CD,CST_NAME,T04Customer.TOWN_CD,ADDRESS,TEL,BIRTH,SEX_CD,
ZIP_CODE,TOWN_NAME,CITY_NAME,PREF_NAME
FROM T04Customer,T03Town,T02City,T01Prefecture
WHERE T04Customer.TOWN_CD = T03Town.TOWN_CD
AND T03Town.CITY_CD = T02City.CITY_CD
AND T02City.PREF_CD = T01Prefecture.PREF_CD;

SQL実行結果
access-sql154.gif


【5】次は「T01Prefecture」、「T02City」、「T03Town」、「T04Customer」、「T05Sex」の場合です。

access-sql151.gif

PREF_CD、CITY_CD、TOWN_CD、SEX_CDという共通のフィールドがあり、線でつながっています。

この場合主役はT04Customerです。***『主役は変わりません』*** T04Customerだけだと性別が分かりませんので、そのためにT05Sexを使っています。もしT04Customerに性別があればT05Sexは不要です。

以上の理由からSELECT部分ではT04Customer.SEX_CDのほうを使います。

SELECT CST_CD,CST_NAME,T04Customer.TOWN_CD,ADDRESS,TEL,BIRTH,T04Customer.SEX_CD,
ZIP_CODE,TOWN_NAME,CITY_NAME,PREF_NAME,SEX
FROM T04Customer,T03Town,T02City,T01Prefecture,T05Sex
WHERE T04Customer.TOWN_CD = T03Town.TOWN_CD
AND T03Town.CITY_CD = T02City.CITY_CD
AND T02City.PREF_CD = T01Prefecture.PREF_CD
AND T04Customer.SEX_CD = T05Sex.SEX_CD;

SQL実行結果
access-sql155.gif


【6】「SQL練習」は保存しないで終了してください。


【解説】
主役はテーブル間の関係によって変わることがわかったと思います。いままで学習に使ってきたデータベースのテーブル構成は顧客管理システムといえます。顧客管理が目的なので当然T04Customerが主役になります。

しかしT04Customerがいつまでも主役ということではありません。例えば新しく伝票テーブルを追加し、売上管理システムにした場合は、顧客のデータは売上伝票の一部(伝票にCST_CDだけ保存)となり脇役になります。

スポンサードリンク

スポンサードリンク






Access SQL初心者入門講座TOPへ