データベース千夜一夜第11回

テーブルの関連付け(1)~SQLによるリレーションの基本 長谷川裕行
有限会社 手國堂

3つのテーブルを関連付ける

今度は、商品の情報と仕入先の情報に加えて、在庫数も表示させてみましょう。「商品_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



あとがき

リレーションの設定というと、既にテーブルが適正に分割された状態で説明されることが多く、「何となく意味は分かるのだけれど、いざ実務で実際に試そうと思うと手が出せなくなってしまう」といった人も少なからずいるようです。

かといってテーブルの正規化を学ぼうと思うと、リレーショナルデータベースの父・コッド博士の関係理論から難しい話が始まって……と、なかなか簡単に理解できるものではありませんでした。

そこで今回は、とにかく実例で正規化の意味と重要性を押さえ、関連付けの大前提であるテーブルの分割を理解してもらおうと考えました。

まずは基本をしっかり押さえてください。次回以降、さらに深いリレーションの設定と応用例を紹介していきます。


Downloadサンプルファイル (LZH形式 759KB)



トップページ
リレーションと正規化(1)
リレーションと正規化(2)
リレーションは2つのテーブルの関係
SQLによる関連付け
3つのテーブルを関連付ける
2つの式をANDでつなぐ
商品、仕入先、在庫を関連付ける
処理結果を並べ替える
あとがき
Copyright © MESCIUS inc. All rights reserved.