2_04_14-検索処理(結合処理 外部結合)(select)

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



● 2_04_14-検索処理(結合処理 外部結合)(select)

 まず自然結合と外部結合の違いをSQLの出力で比較してみましょう。
 「e_shouhin_t」の商品テーブルと「e_hanbai_t」の販売履歴を結合して顧客情報は出さずに顧客IDだけ出力します。
 3つ全て結合するほうが詳細ですが演習ですので2つの結合でいきます。

 初めに自然結合でSQLを発行します。
SELECT
s.e_shouhin_id 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 カテゴリ,

h.e_hanbai_id as 販売コード,
h.e_kokyaku_id as 顧客ID,
h.e_hanbai_date as 販売日
FROM
e_shouhin_t s natural join e_hanbai_t h
ORDER BY
s.e_shouhin_id

これの出力結果は以下です。販売実績のある商品しか検索できません。
売れていない商品の情報は出ない事になります。


次に下記のSQLを実行して下さい。left outer joinという文字に注目して下さい。
外部結合では「USING」が必ず必要です。
SELECT
    s.e_shouhin_id 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 カテゴリ,
	
    h.e_hanbai_id as 販売コード,
    h.e_kokyaku_id as 顧客ID,
    h.e_hanbai_date as 販売日
FROM
    e_shouhin_t s left outer join e_hanbai_t h using(e_shouhin_id)
ORDER BY
    s.e_shouhin_id

今度は販売実績が無い商品の情報も検索されました。


left outer joinがあるならright outer joinもありそうですね。確かにあります。下記を実行してみて下さい。
SELECT
    s.e_shouhin_id 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 カテゴリ,
	
    h.e_hanbai_id as 販売コード,
    h.e_kokyaku_id as 顧客ID,
    h.e_hanbai_date as 販売日
FROM
    e_shouhin_t s right outer join e_hanbai_t h using(e_shouhin_id)
ORDER BY
    s.e_shouhin_id

よく見ると、一番初めの自然結合と同じ結果です。


この「left」、「right」はどちらを基にしているかを決める約束事になっています。

「left」はこの場合は商品ですから、商品の情報が主になります、「全ての商品に対して」という事になります。
「right」は販売履歴ですから、「全ての販売履歴に対して」ということになります。

では3つのテーブルを結合します。以下のSQLを実行してください。
SELECT
    s.e_shouhin_id 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 カテゴリ,
	
    h.e_hanbai_id as 販売コード,
    h.e_kokyaku_id as 顧客ID,
	
    k.e_kokyaku_name as 顧客名,
    k.e_kokyaku_adress_1 as 住所(都道府県),

    h.e_hanbai_date as 販売日
FROM
    e_shouhin_t s 
        left outer join 
    e_hanbai_t h 
            using(e_shouhin_id) 
        left outer join 
    e_kokyaku_t k
            using(e_kokyaku_id )
ORDER BY
    s.e_shouhin_id

以下の結果が出力されます。

ここまでの外部結合では「left」、「right」で基にするテーブルを決めていましたが「full」を使うとどちらかのテーブルにデータが無くても空白部分を出力できます。

SELECT
    s.e_shouhin_id 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 カテゴリ,
	
    h.e_hanbai_id as 販売コード,
    h.e_kokyaku_id as 顧客ID,
	
    k.e_kokyaku_name as 顧客名,
    k.e_kokyaku_adress_1 as 住所(都道府県),

    h.e_hanbai_date as 販売日
FROM
    e_shouhin_t s 
        full outer join 
    e_hanbai_t h 
            using(e_shouhin_id) 
        full outer join 
    e_kokyaku_t k
            using(e_kokyaku_id )
ORDER BY
    s.e_shouhin_id

出力結果は先ほどとまったく同一です。



テーブルどうしの関係を踏まえてデータの整理、テーブル作成、主キー、外部キーのカラム名の決定などに配慮して下さい。


戻る

Copyright (c) 2007 MSweb All Rights Reserved

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

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