広告

【MySQL】LEFT JOINとRIGHT JOINを使って全てのデータを表示する

2019年9月11日

MySQLでLEFT(RIGHT)JOINを使って、NULL値であってもデータを取得・表示する方法のメモです。

LEFT JOINとRIGHT JOINのイメージGIF

LEFT JOINとRIGHT JOINは外部結合

まずは内部結合と外部結合の違いを理解します。

WHERE句を使って、テーブルの一致する行だけを表示することを内部結合と呼ぶ。
LEFT JOINやRIGHT JOINを使い、2つ以上のテーブルのどちらかを優先させ全ての行を表示することを外部結合と呼ぶ。
OYAKUN
OYAKUN
※ 理解が間違ってたらごめんなさい。

LEFT JOINとRIGHT JOINの記述方法

LEFT JOINとRIGHT JOINの記述方法を紹介します。

LEFT JOINの記述形式

SELECT フィールド名1,フィールド名2,〜フィールド名n
FROM テーブル名1 LEFT JOIN テーブル名2 ON テーブル名1.フィールド名 = テーブル名2.フィールド名
WHERE 抽出条件

次にRIGHT JOIN。

RIGHT JOINの記述形式

SELECT フィールド名1,フィールド名2,〜フィールド名n
FROM テーブル名1 RIGHT JOIN テーブル名2 ON テーブル名1.フィールド名 = テーブル名2.フィールド名
WHERE 抽出条件

LEFTかRIGHTが書き換わっただけで、他のテーブル名などの指定は全て同じなんですよね^^

要約すると、

  • LEFT JOINだと左側のテーブル名1の全レコードが表示される
  • RIGHT JOINだと右側のテーブル名2の全レコードが表示される

こんな感じですかね。

MySQLでLEFT JOINを使ったテーブル結合例

LEFT JOINを使って、以下2つのテーブルを結合してみます。

A基板テーブル

A基板のテーブル

部品在庫テーブル

部品在庫テーブル

ちなみに各テーブルに挿入した値は以下↓

A基板テーブルに挿入した値

INSERT INTO A基板 SET 部品名='チップ抵抗',quantity=1000;
INSERT INTO A基板 SET 部品名='LED',quantity=200;
INSERT INTO A基板 SET 部品名='トランジスタ',quantity=40;

部品在庫テーブルに挿入した値

INSERT INTO 部品在庫 SET 部品名='電解コンデンサ',`parts_id`=1,COUNT=300;
INSERT INTO 部品在庫 SET 部品名='チップ抵抗',`parts_id`=2,COUNT=30000;
INSERT INTO 部品在庫 SET 部品名='トランジスタ',`parts_id`=3,COUNT=100;
INSERT INTO 部品在庫 SET 部品名='レギュレーター',`parts_id`=4,COUNT=50;
INSERT INTO 部品在庫 SET 部品名='LED',`parts_id`=5,COUNT=6000;
INSERT INTO 部品在庫 SET 部品名='スイッチ',`parts_id`=6,COUNT=3000;
INSERT INTO 部品在庫 SET 部品名='コネクタ',`parts_id`=7,COUNT=300;

LEFT JOINのSQL文例

A基板の部品必要数(quantity)に対して、該当する部品の在庫があるのか(COUNT)、フィールド「部品名」を元に調べてみます。

LEFT JOINのSQLは以下を入力して実行↓

SELECT * FROM A基板 LEFT JOIN 部品在庫 ON A基板.部品名=部品在庫.部品名;

SQLの実行結果↓
A基板と部品在庫テーブルをLEFT JOIN

A基板のテーブルをLEFT JOINしたので、部品在庫テーブルが右側にくっついてますね。

OYAKUN
OYAKUN
A基板に対して部品在庫があるかどうか、これならひと目で分かります。

じゃあ、SQLの「LEFT JOIN」の箇所を「RIGHT JOIN」に変更するとどうなるのか。

RIGHT JOINのSQL文例

以下を入力して実行

SELECT * FROM A基板 RIGHT JOIN 部品在庫 ON A基板.部品名=部品在庫.部品名;

RIGHT JOINの実行結果↓

A基板と部品在庫をRIGHT JOIN

部品在庫テーブルが右側、A基板のテーブルが左側に結合されました^^

OYAKUN
OYAKUN
A基板で使われない部品在庫も、全部表示されています

まとめ

LEFT JOINとRIGHT JOIN、リレーションより難しくなく、より簡単に他のテーブルの値を参照することができる感じがしました。

MySQLをデータベースに部品在庫の管理をやっていれば、けっこうデータを引っ張ってくるのに使えそうっすね。

OYAKUN
OYAKUN
次回記事
MySQL-DISTINCT-remove
【MySQL】DISTINCTで重複したデータを除外した結果を取得する方法

MySQLでDISTINCTを使って指定したカラムの重複した行を除外する方法を記してます。 補足 MySQLのLEFT ...

続きを見る

関連記事:【MySQL】GROUP BYで商品ごとの合計を算出する(phpMyAdmin)
関連記事:【MySQL】リレーションを設定する方法(phpMyAdmin)
関連記事:【MySQL】SUM・COUNT・AVGでカラムの値を集計する(phpMyAdmin)