目的
- 複数のテーブルを結合する際の公文をまとめる。
例
- 何かしらのデータが格納されているテーブルA テーブルB テーブルCが存在すると過程する。
- テーブルAにテーブルBとテーブルCを結合し、データを取得する方法の例を下記に記載する。
select 出力するカラム
from テーブルA
join テーブルB
on テーブルAとテーブルBの結合条件
join テーブルC
on テーブルAとテーブルCの結合条件;
具体例1
-
ユーザのid、名前、年齢層のid、結婚の有無のidのデータが格納されるusersテーブルと年齢層のidと年齢層を紐づけるage_rangesテーブルと、結婚の有無のidと結婚の有無の文字列情報を紐づけるmarriagesテーブルが存在していると過程する。
-
下記にテーブルの詳細情報を記載する。
-
usersテーブル
カラム名 格納される値の情報 id 数値が自動インクリメントされて格納される name ユーザ名を表す文字列 age_renge_id ユーザの年齢層を識別するID marriage_id ユーザの結婚の有無を識別するID -
age_rengesテーブル
カラム名 格納される値の情報 id 数値が自動インクリメントされて格納される age_range 年齢層を指定する文字列(20代など) -
marriagesテーブル
カラム名 格納される値の情報 id 数値が自動インクリメントされて格納される marriage 既婚か未婚かの文字列
-
-
下記の様にダミーデータが格納されている物とする。
-
usersテーブル
id name age_renge_id marriage_id 1 miriwo 2 1 -
age_rengesテーブル
id age_renge 1 未成年 2 20代 3 30代 -
marriagesテーブル
id marriage 1 未婚 2 既婚
-
-
select文でusersテーブルの情報のみをまずは取得してみる。
-
下記を実行してusersテーブルのidが1のレコードの全てのカラムのデータを出力する。
select * from users where id = 1;
-
先のSQLにてuserの情報を得ることができたが、年齢層と結婚の有無がidで格納されているためこの結果だけでは正確な情報を得ることはできない。年齢層、結婚の有無も文字列として表示する場合は三つのテーブルを結合する。
-
年齢層、結婚の有無を日本語の文字列で表示する際は下記を実行する。(出力するカラムはusersテーブルのidカラム、 usersテーブルのnameカラム、age_rangesテーブルのage_rengeカラム、marriagesテーブルのmarriageカラム)
select users.id, users.name, age_ranges.age_range, marriages.marriage from users join age_ranges on users.age_renge_id = age_ranges.id join marriages on users.marriage_id = marriages.id where id = 1;
-
データ参照のイメージを下記に記載する
-
具体例2
-
ユーザのid、名前が格納されているusersテーブルとユーザとキーワードidを紐づけるkeywordsテーブルと、キーワードidとキーワード文字列紐づけるkeyword_contentsテーブルが存在していると過程する。
-
下記にテーブルの詳細情報を記載する。
-
usersテーブル
カラム名 格納される値の情報 id 数値が自動インクリメントされて格納される name ユーザ名を表す文字列 -
keywordsテーブル
カラム名 格納される値の情報 id 数値が自動インクリメントされて格納される user_id ユーザのidが格納されている keyword_id キーワードのidが格納されている -
keyword_contentsテーブル
カラム名 格納される値の情報 id 数値が自動インクリメントされて格納される keyword キーワードの文字列
-
-
下記の様にダミーデータが格納されている物とする。
-
usersテーブル
id name 1 miriwo -
keywordsテーブル
id user_id keyword_id 1 1 1 2 1 2 3 1 5 -
keyword_contentsテーブル
id keyword 1 熱帯魚 2 PHP 3 釣り 4 アウトドア 5 DIY
-
-
ユーザ情報とキーワードの情報を出力する際は下記を実行する。(出力するカラムはusersテーブルのidカラム、 usersテーブルのnameカラム、keyword_contentsテーブルのkeywordカラム、usersテーブルのidカラムとnameカラムは重複して表示されるが正常名動作である。)
```sql select users.id, users.name, keyword_contents.keyword from users join keyrowds on users.id = keyrowds.user_id join keyrowd_contents on keyrowds.keyword_id = keyrowd_contents.id where id = 1; ```