##LEFT JOINとは?
FROMで指定したテーブルのレコードを全て取得する。外部キーがNULLのレコードもNULLのまま実行結果に表示される。
###JOINとの違い
JOIN
はFROMで取得したカラム、レコードを表示しない。対してLEFT JOIN
はFROMで表示したレコード(外部キーを持つ子テーブル)を全て取得する。
要するにFROMで取得したカラムを表示するか、しないかの問題です。
###例題
playersテーブルにteamsテーブルに結合させて、playersテーブルのnameカラム、teamsテーブルのnameカラムを取得する。
テーブルは以下の通り。レコードは省略。
playersテーブル
id | name | goals | height | country_id | previous_team_id |
---|---|---|---|---|---|
teamsテーブル
id | name |
---|---|
playersテーブルにteamsテーブルを結合させるので、playersテーブルが子テーブルで外部キーを持つ。
そしてteamsテーブルが親テーブルで主キーを持つ。
したがってSQL文にすると以下のようになる。
SELECT カラム名, カラム名
FROM 外部キーを持つ小テーブル
left join 主キーを持つ親テーブル
on 小テーブル.外部キーのカラム = 親テーブル.主キーのカラム ;
カラム、テーブルを適合させると、
SELECT players.name , teams.name
FROM players
left join teams
on players.previous_team_id = teams.id ;
となります。
##JOINとLEFTJOINを掛け合わせる方法
###例題
playersテーブルにcountriesテーブルとteamsテーブルを結合して、データを取得する。
テーブルは以下の通り。レコードは省略。
playersテーブル
id | name | goals | height | country_id | previous_team_id |
---|---|---|---|---|---|
teamsテーブル
id | name |
---|---|
countriesテーブル
id | name | rank |
---|---|---|
各テーブルの関係性を整理すると
playersテーブルにcountriesテーブルを結合させる
→playersテーブルは外部キーを持つ子要素、countriesテーブルは主キーを持つ親要素。
playersテーブルにteamsテーブルを結合させる
→→playersテーブルは外部キーを持つ子要素、teamsテーブルは主キーを持つ親要素。
となります。
日本語に置き換えると、
SELECT *
FROM 外部キーを持つ子テーブル
join 主キーを持つ親テーブル
on 子テーブル.外部キーを持つカラム名 = 親テーブル.主キーであるカラム名
left join 主キーを持つ親テーブル
on 子テーブル.外部キーを持つカラム名 = 親テーブル.主キーであるカラム名
となります。
SQL文にすると以下のようになります。
SELECT *
FROM players
join countries
on players.country_id = countries.id
left join teams
on players.previous_team_id = teams.id;
teamsテーブルはleft joinを使っているので取得したデータの一番左側がteamsテーブルのデータになります。