Help us understand the problem. What is going on with this article?

INNER JOIN とか OUTER JOINとか何だっけ?

久々のSQLでJOINの違いを忘れてしまった。
しっかり覚えるためにもQiitaに記載。

基本的に、SQLのJOINには以下の種類がある。

・内部結合のINNER JOIN
・外部結合のOUTER JOIN

これらに利用方法について説明します。

INNER JOIN

内部結合は、結合条件で指定したカラムの値が、両方の表に存在している行だけを対象として結合を返す。

基本構文

SELECT カラム名
  FROM テーブル名1 [INNER] JOIN テーブル名2
  ON テーブル名1.列名 = テーブル名2.列名

内部結合がどのように行われるか、具体的な表を使って説明します。
ここには、受注と受注先情報があります。

表1 受注

受注番号 受注先コード 受注日
00001 001 2020/01/10
00002 003 2020/02/01
00003 002 2020/03/01

表2 受注先情報

受注先コード 受注先名 場所名
001 工場A 東京都○○○○○
002 工場B 神奈川県○○○○○
003 商店A 茨城県○○○○○
004 商店B 宮崎県○○○○○

ここで以下のSQLを実行します。
この場合、受注テーブルの受注先コードと同じ値の受注先コードをもつ受注先情報テーブルのレコードを受注先情報テーブルに結合して取得します。受注テーブルと対応する受注先情報のレコードが存在しなければ、その行は取得されない。

SELECT *
  FROM 受注 INNER JOIN 受注先情報
  ON 受注.受注先コード = 受注先情報.受注先コード

内部結合後の表は以下になります。

受注番号 受注先コード 受注日 受注先コード 受注先名 場所名
00001 001 2020/01/10 001 工場A 東京都○○○○○
00002 003 2020/02/01 003 商店A 茨城県○○○○○
00003 002 2020/03/01 002 工場B 神奈川県○○○○○

受注テーブルは4行あったのにも関わらず、3行しか表示されません。
これは、ベースとなる受注テーブルと条件が一致しないレコードが削除されたからです。
つまり、内部結合とは、ベースとなるテーブルと条件が一致するレコードのみを取得する結合になります。

OUTER JOIN

外部結合は、結合するテーブルの片方にしか存在しないものに関しても取得します。

基本構文

SELECT カラム名
  FROM テーブル名1 LEFT[RIGHT] OUTER JOIN テーブル名2
  ON テーブル名1.列名 = テーブル名2.列名

外部結合には、LEFT OUTER JOINとRIGHRT OUTER JOINの2種類があります。

・LEFT OUTER JOIN: テーブル名1を軸にして外部結合を行う
・RIGHT OUTER JOIN: テーブル名2を軸にして外部結合を行う

先ほどの表を使って以下のSQLを実行します。

SELECT *
  FROM 受注 LEFT OUTER JOIN 受注先情報
  ON 受注.受注先コード = 受注先情報.受注先コード
受注番号 受注先コード 受注日 受注先コード 受注先名 場所名
00001 001 2020/01/10 001 工場A 東京都○○○○○
00002 003 2020/02/01 003 商店A 茨城県○○○○○
00003 002 2020/03/01 002 工場B 神奈川県○○○○○

先ほどのINNER JOINと同じ結果が取得されました。
これは先ほとど同様に表1を軸にSQLを実行したからです。

次にRIGHT OUTER JOINを実行

受注番号 受注先コード 受注日 受注先コード 受注先名 場所名
00001 001 2020/01/10 001 工場A 東京都○○○○○
00003 002 2020/03/01 002 工場B 神奈川県○○○○○
00002 003 2020/02/01 003 商店A 茨城県○○○○○
null null null 004 商店B 宮崎県○○○○○

受注先情報をベースに結合を行なっているため、受注先情報の受注先コードでソートされています。
また、受注先情報をベースに結合するので、結合条件を満たるレコードがなくてもnullが設定された状態で表を結合します。

まとめ

INNER JOINは、ANDの結合
OUTER JOINは、ORの結合
と覚えておけば、久々に利用するときもパッと思い出せるかな

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away