2_04_13-検索処理(結合処理 自然結合)(select)

PHPとPostgreSQLを利用したWEBシステムの開発例を掲載していきます。腕時計 販売サイト my-watch.biz



● 2_04_13-検索処理(結合処理 自然結合)(select)

 今までは1つのテーブルに対してのSQLでしたがここから複数テーブルに対するデータの抽出を行います。
 先に作った3つのテーブルを説明します。演習用ですからできるだけ単純にしています。

「e_shouhin_t」商品情報を格納したテーブル
カラム名 内容の詳細
e_shouhin_id 商品コード
e_shouhin_name 商品名
e_shouhin_color 色 reは赤 brは黒 blは青
e_shouhin_size サイズ
e_shouhin_kakaku 商品価格
e_shouhin_group 商品カテゴリ shはシャツ tsはTシャツ
e_shouhin_date データ登録日時
 
「e_kokyaku_t」顧客情報を格納したテーブル
カラム名 内容の詳細
e_kokyaku_id 顧客ID
e_kokyaku_name 顧客名
e_kokyaku_adress_1 住所1 都道府県名 ローマ字表示
e_kokyaku_adress_2 住所2 都道府県から下、実表示
e_kokyaku_tel 電話番号
e_kokyaku_keitai 携帯番号
e_kokyaku_fax ファックス
e_kokyaku_mail メールアドレス
e_kokyaku_shokugyou 職業 Kは会社員 Dは独立自営業者
e_kokyaku_company 会社名
e_kokyaku_c_adress_1 会社住所1 都道府県名 ローマ字表示
e_kokyaku_c_adress_2 会社住所2 都道府県から下、実表示
e_kokyaku_marry 独身か既婚か Kは既婚 Dは独身
e_kokyaku_touroku 顧客登録日
 
「e_hanbai_t」顧客が商品を購入した履歴
カラム名 内容の詳細
e_hanbai_id 販売履歴ID
e_shouhin_id 商品コード
e_kokyaku_id 顧客ID
e_hanbai_date 販売日

内容は単純で、一括りで表すと「ある商品を、ある人が買った情報」という程度です。

まず「商品がいつ、どれだけ売れたのか」という情報を出します。
関係するのは「e_shouhin_t」と「e_hanbai_t」の2つですね。

「e_shouhin_t」のテーブルの主キーは「e_shouhin_id」です。
「e_hanbai_t」には「e_shouhin_id」として設定されています。

「e_hanbai_t」において「e_shouhin_id」は「外部キー」という役目になります。
つまりここから商品情報を参照している、紐付けしていることになります。

カラム名が主キー、外部キーで一致しているので自然にそこが軸となって結合させる事ができます。


以下が自然結合のSQLです。 「販売日を昇順で羅列で販売リストを出せ」という内容です。
SELECT
  h.e_hanbai_date as 販売日, 
  
  s.e_shouhin_name as 商品名,
  s.e_shouhin_color as 色,
  s.e_shouhin_size as サイズ,
  s.e_shouhin_kakaku as 販売価格,
  s.e_shouhin_group as 商品カテゴリ
FROM
  e_shouhin_t s NATURAL join e_hanbai_t h order by h.e_hanbai_date

NATURAL join」の両端に2つのテーブルがあります。「NATURAL join」が2つのテーブルを繋いでいることになります。

実行結果は以下になります。


次に商品毎の集計を取ってみましょう。

SELECT
    s.e_shouhin_id as 商品コード,
    sum(s.e_shouhin_kakaku) as 販売価格
FROM
    e_shouhin_t s NATURAL join e_hanbai_t h
GROUP BY
    s.e_shouhin_id
ORDER BY
    s.e_shouhin_id

実行すると以下が出力されます。


次は3つのテーブル全てを結合します。

販売日順に購入実績を出します。
SELECT
    h.e_hanbai_date as 販売日,
	
    k.e_kokyaku_name as 顧客名,
    k.e_kokyaku_mail as メールアドレス,
	
    s.e_shouhin_name as 商品名,
    s.e_shouhin_color as 色,
    s.e_shouhin_size as サイズ,
    s.e_shouhin_kakaku as 販売価格,
    s.e_shouhin_group as 商品カテゴリ
FROM
    e_kokyaku_t k NATURAL join e_shouhin_t s NATURAL join e_hanbai_t h
ORDER BY
    h.e_hanbai_date

検索結果は以下になります。


SQLを組む事も大事ですが業務のデータを整理してテーブルに格納する時に各テーブルの主キー、外部キーを確定することを初めにしましょう。
各テーブルがどんな関係にあるのか、それを決めるのが主キー、外部キーの関係ですから。
そしてできるだけ主キー、外部キーの名前を合わせておきましょう。結合するときに楽ですから。


もし結合する時に2つのカラム名が重複した時

 自然結合では同じカラム名で結合されます。もし両方のテーブルに下の図のようにそれぞれ持っていた場合はどちらかを指定しなければなりません。


 その場合は「テーブル名 JOIN テーブル名 USING (列名)」とします。

 下記は例のSQLです。
SELECT
  h.e_hanbai_date as 販売日, 
  
  s.e_shouhin_name as 商品名,
  s.e_shouhin_color as 色,
  s.e_shouhin_size as サイズ,
  s.e_shouhin_kakaku as 販売価格,
  s.e_shouhin_group as 商品カテゴリ
FROM
  e_shouhin_t s join e_hanbai_t h using( e_shouhin_id ) order by h.e_hanbai_date

 しかし、これはできるだけ避けて下さい。SQLを発行する以前にデータベース・システムの仕様そのものが分かり難くなります。
 カラム名を命名する時に「どこのテーブルの、どんな名前で、主キーなのか、外部キーなのか、それ以外の何であるか。」を明確にして下さい。

 極端な例ですが、全てのテーブルの主キーを「ID」としてしまったら仕様書が分かり難くて仕方がありませんから。

結合条件を自由に設定する

 結合するカラム名が同一でない場合でも結合することができます。

 「テーブル名 JOIN テーブル名 ON ( テーブル名.別名 =テーブル名.別名 )」
 を使います。


以下のSQLになります。
SELECT
  h.e_hanbai_date as 販売日, 
  
  s.e_shouhin_name as 商品名,
  s.e_shouhin_color as 色,
  s.e_shouhin_size as サイズ,
  s.e_shouhin_kakaku as 販売価格,
  s.e_shouhin_group as 商品カテゴリ
FROM
  e_shouhin_t s join e_hanbai_t h on ( s.e_shouhin_id = h.shouhin_id ) order by h.e_hanbai_date

※ 自然結合では相手のテーブルにレコードが無いと検索対象から除外されます。
  後で紹介する外部結合では上記でも検索することができます。自然結合は、内部結合とも呼ばれます。

戻る

Copyright (c) 2007 MSweb All Rights Reserved

腕時計 クロノグラフ(時計)のメンズ専門販売サイトカシオ G-SHOCK、Baby-G(腕時計)専門の通信販売サイトG-SHOCK、Baby-G専門通販サイト 運営ブログ

腕時計 女性専用 販売のladies-watch.biz腕時計 メンズ(男性)専門販売のmens-watch.biz