masayuki5160's diary

名古屋でエンジニアしてます。

JOINを使ってみる

JOINをどう使ったらいいかわからんな〜、
と思ってたんですが前回つくった環境でいろいろやってたらやっとわかってきた気がします。

phpMyAdminって便利
http://d.hatena.ne.jp/masayuki5160/20120421/1335022267

今回使用したテーブルは以下4つ
1.売上データ
2.商品マスタ
3.担当者マスタ
4.顧客マスタ

構造はこんな感じ(ER図とかかけばいいんですけど、めんどくさいので。。)

CREATE TABLE IF NOT EXISTS `売上データ` (
`伝票番号` decimal(10,0) NOT NULL,
`行番号` decimal(10,0) NOT NULL,
`処理日` datetime NOT NULL,
`商品ID` decimal(10,0) NOT NULL,
`担当者ID` decimal(10,0) NOT NULL,
`顧客ID` decimal(10,0) NOT NULL,
`数量` decimal(10,0) NOT NULL,
PRIMARY KEY (`伝票番号`,`行番号`),
KEY `fk_shohin` (`商品ID`),
KEY `fk_tanto` (`担当者ID`),
KEY `fk_kokyaku` (`顧客ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `商品マスタ` (
`商品ID` decimal(10,0) NOT NULL,
`商品名` varchar(30) NOT NULL,
`グループ名` varchar(20) NOT NULL,
`仕入単価` decimal(10,0) DEFAULT NULL,
`卸単価` decimal(10,0) DEFAULT NULL,
PRIMARY KEY (`商品ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE IF NOT EXISTS `担当者マスタ` (
`担当者ID` decimal(10,0) NOT NULL,
`担当者名` varchar(20) NOT NULL,
`ふりがな` varchar(20) NOT NULL,
`MGR_ID` decimal(10,0) DEFAULT NULL,
`生年月日` datetime NOT NULL,
`性別` decimal(10,0) NOT NULL,
PRIMARY KEY (`担当者ID`),
KEY `fk_mgr` (`MGR_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


CREATE TABLE IF NOT EXISTS `顧客マスタ` (
`顧客ID` decimal(10,0) NOT NULL,
`顧客名` varchar(20) NOT NULL,
`連絡先` varchar(20) NOT NULL,
PRIMARY KEY (`顧客ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


1.誰が、いつ、なにを売ったのかの一覧を取得する。

SQLは下記(LIMIT 0 , 30はphpMyAdmin上でやったので自動でついてきました)

SELECT 担当者名, 処理日, 商品名
FROM 売上データ
INNER JOIN 商品マスタ ON 売上データ.商品ID = 商品マスタ.商品ID
INNER JOIN 担当者マスタ ON 売上データ.担当者ID = 担当者マスタ.担当者ID
LIMIT 0 , 30

結果はこんな感じ。

担当者名 処理日 商品名
鈴木 2006-04-06 00:00:00 デスクトップ型パソコン
鈴木 2006-04-06 00:00:00 19型_ディスプレイ
小野 2006-04-12 00:00:00 デスクトップ型パソコン
小野 2006-04-18 00:00:00 デスクトップ型パソコン
斎藤 2006-04-26 00:00:00 ノート型パソコン
斎藤 2006-04-26 00:00:00 プリンタ
斎藤 2006-04-26 00:00:00 スキャナ
伊藤 2006-05-08 00:00:00 17型_ディスプレイ
小野 2006-05-12 00:00:00 デスクトップ型パソコン
小野 2006-05-12 00:00:00 17型_ディスプレイ
小林 2006-05-19 00:00:00 ノート型パソコン
伊藤 2006-05-22 00:00:00 ノート型パソコン
宇賀神 2006-05-25 00:00:00 15型_液晶ディスプレイ
小野 2006-06-02 00:00:00 15型_液晶ディスプレイ
斎藤 2006-06-06 00:00:00 ノート型パソコン
斎藤 2006-06-06 00:00:00 ターミナルアダプタ
伊藤 2006-06-12 00:00:00 ノート型パソコン
佐瀬 2006-06-15 00:00:00 HUB
佐瀬 2006-06-15 00:00:00 ノート型パソコン
佐瀬 2006-06-15 00:00:00 ターミナルアダプタ

誰が、いつ、なにを、、という情報は売上データテーブルにのっています。
ただ担当者ID、商品IDとして登録されているので
それぞれ担当者マスタテーブルから担当者名、商品マスタテーブルから商品名をひもづけてINNER JOINします。

そしてできたテーブルから必要な情報をSELECTしています。



2.担当者 鈴木がいつ何を売ったのかを一覧取得する

SQLはこんな感じで

SELECT 処理日, 担当者名, 商品名
FROM 売上データ
INNER JOIN 担当者マスタ ON 売上データ.担当者ID = 担当者マスタ.担当者ID
INNER JOIN 商品マスタ ON 売上データ.商品ID = 商品マスタ.商品ID
WHERE 担当者名 = "鈴木"
LIMIT 0 , 30


結果はこんなんです。

処理日 担当者名 商品名
2006-04-06 00:00:00 鈴木 デスクトップ型パソコン
2006-04-06 00:00:00 鈴木 19型_ディスプレイ

売上データテーブルにいつ、誰が、何を、
という情報はあるので前回と同じようにINNER JOINをします。
ただ今回は担当者が鈴木と指定するのでWHEREで指定しています。




JOINしてできあがるテーブルをイメージするのが大事なんだな、と感じました。

参考資料

現場で使えるSQL 第2版 (DB Magazine SELECTION)

新品価格
¥2,376から
(2017/3/19 15:28時点)