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