今度は、商品の情報と仕入先の情報に加えて、在庫数も表示させてみましょう。「商品_mr」「仕入先_mr」「在庫_mr」の3つのテーブルを使います。
- 2つの式をANDでつなぐ -
先述したように、テーブルが3つになっても関連付けは常に1つのテーブルと1つのテーブルの間で設定するので、WHERE句では2つのテーブルのフィールドを結びつけます。従ってテーブルが3つの場合は、WHERE句に続けてテーブルを関連付ける式を2つ書かなければならないことになります。
2つの式はAND演算子で結びます。
WHERE <テーブルA>.<フィールド> = <テーブルB>. <フィールド> ---- (a) AND <テーブルA>.<フィールド> = <テーブルC>. <フィールド> ---- (b)
(a)の式では「テーブルAとテーブルB」、(b)の式では「テーブルAとテーブルC」の関連付けを記述します。「テーブルがいくつあっても、関連付けは常に2つのテーブル間の問題」ということを理解していれば、このことはすぐに分かりますね。
- 商品、仕入先、在庫を関連付ける -
「商品_mr」「仕入先_mr」「在庫_mr」の3つのテーブルを関連付けて、
商品ID/品名/仕入単価/仕入先/在庫
の各フィールドを表示させるSQLは以下のようになります。先に紹介した別名を使って、「商品_mr:A」「仕入先_mr:B」「在庫_mr:C」としています。
SELECT A.商品ID, A.品名, A.仕入単価, A.仕入先ID, B.仕入先名, C.在庫
FROM 商品_mr AS A, 仕入先_mr AS B, 在庫_mr AS C
WHERE A.仕入先ID = B.仕入先ID
AND A.商品ID = C.商品ID
- 処理結果を並べ替える -
関連付けはWHERE句で行いますが、ここではレコードを抽出するためにSELECT命令を使っているため、抽出した結果のレコード群をORDER BY句で並べ替えることもできます。
先に掲げたSQLを元に、レコードを「仕入先名」の順に並べ替えて仕入先ごとにまとめ、さらに同じ仕入先の場合は「商品ID」の順に並べる──というSQLは、以下のようになります。
SELECT A.商品ID, A.品名, A.仕入単価, A.仕入先ID, B.仕入先名, C.在庫 FROM 商品_mr AS A, 仕入先_mr AS B, 在庫_mr AS C WHERE A.仕入先ID = B.仕入先ID
AND A.商品ID = C.商品ID
ORDER BY B.仕入先名, A.商品ID
リレーションの設定というと、既にテーブルが適正に分割された状態で説明されることが多く、「何となく意味は分かるのだけれど、いざ実務で実際に試そうと思うと手が出せなくなってしまう」といった人も少なからずいるようです。
かといってテーブルの正規化を学ぼうと思うと、リレーショナルデータベースの父・コッド博士の関係理論から難しい話が始まって……と、なかなか簡単に理解できるものではありませんでした。
そこで今回は、とにかく実例で正規化の意味と重要性を押さえ、関連付けの大前提であるテーブルの分割を理解してもらおうと考えました。
まずは基本をしっかり押さえてください。次回以降、さらに深いリレーションの設定と応用例を紹介していきます。
サンプルファイル (LZH形式 759KB)
|
|
|