データベースの設計シリーズ
http://blogs.wankuma.com/rti/archive/2006/12/14/50719.aspx (その1)
http://blogs.wankuma.com/rti/archive/2006/12/19/52221.aspx (その2)
データベースの設計も終わったので、頭から無くならないうちに結合ネタです。(予想通り! By キラw)
「質問で~すっ、正規化して分解するだけして、どうやって元に戻すんでしょう?」って誰も突っ込まないのは、皆知っているからですね~
でも良いのです。これはあくまでも(キラだから)
基礎編だから。
で、結合とは何なのか?
前回までに、実際に管理するテーブルを以下のように3つに分離しました。
利用者名簿
・利用者番号(キー)
・利用者氏名
書籍名簿
・書籍番号(キー)
・書籍名
貸出履歴
・連番(キー)
・貸出日
・利用者番号(インデックス)
・書籍番号(インデックス)
・返却日
*訳があって、テーブルという文字列は省きました
そして、こうした方が良いよ~、と言う理由も説明しました。
しかし、以下の表(元の表)のように一覧表を画面に表示したいとか、印刷したいという場合がありますよね。
連番 |
貸出日 |
利用者番号 |
利用者氏名 |
書籍番号 |
書籍名 |
返却日 |
1 |
|
|
|
|
|
|
2 |
|
|
|
|
|
|
3 |
|
|
|
|
|
|
4 |
|
|
|
|
|
|
5 |
|
|
|
|
|
|
6 |
|
|
|
|
|
|
この場合、3つのテーブルをくっつけることで、ひとつの表のように見せることができるのです。
一般的には、「テーブルを結合する」のように表現します。で、結合するにはクエリーとかビューと(どっちが正しいのか誰か教えて)呼ばれるものを作ります。
そうすると上記の表のようなテーブルのようなものが出来上がるのです。
結合する場合は、次のようなSQLと呼ばれる文字列を書きます。(書くための具体的な方法は、DBMSの種類によって異なります)
SELECT
貸出履歴.連番 AS 連番,
貸出履歴.貸出日 AS 貸出日,
貸出履歴.利用者番号 AS 利用者番号,
利用者名簿.利用者氏名 AS 利用者氏名,
貸出履歴.書籍番号 AS 書籍番号,
書籍名簿.書籍名 AS 書籍名,
貸出履歴.返却日 AS 返却日
FROM
(貸出履歴 LEFT JOIN 利用者名簿 ON 貸出履歴.利用者番号 = 利用者名簿.利用者番号)
LEFT JOIN 書籍名簿 ON 貸出履歴.書籍番号 = 書籍名簿.書籍番号;
いきなり敷居が高くなったような気がしますが、実はそうでもありません。
上記は、「SELECT~ここで項目を定義~FROM ~ここでテーブルを定義」になります。
で、項目の定義ですが、「テーブル名.項目名 AS 表現したい名前」のように書いて , (カンマ)でつなぐだけです。
次の「FROM~」は、3つのテーブルを結合しているのですが、これも()で2回結合を繰り返しているだけです。
まず、()の中の結合から説明します。
「貸出履歴 LEFT JOIN 利用者名簿」の部分ですが、これは左のテーブルを主体として結合して下さいという意味です。
例えば、貸出履歴に100件のデータが登録されていた場合、上記の結合方法だと 100件のデータが表現されることになります。テーブル名を逆にすると、利用者名簿の件数になります。
次に「ON 貸出履歴.利用者番号 = 利用者名簿.利用者番号」です。
これは、この項目名の値が一致するレコードを結合して下さいという意味です。
このように()内で結合した結果に、更に書籍名簿テーブルを結合しているのが()の外側の部分です。
簡単でしょう?
(結合ネタを)R・田中一郎は一日でやってくれました(By ニヤ)
#簡単な説明ですみません。抜けや不足している情報などはコメントで補足してください(って誰がだ?w)します。