SQL LEFT JOIN 外部結合のサンプル

SQLのleft joinのサンプルです。left outer joinとも呼ばれます。

目次

サンプル left join(左外部結合)
  on句の結合条件とwhere句の条件で絞る
  Oracleの場合 (+の記号)
  結合するテーブルが3つの場合
  テーブル3つでOracleの場合 (+の記号)
参考 right join(右外部結合)

left join(左外部結合)

select
   項目
from テーブルA
   left [outer] join テーブルB
on
   結合する条件
where
   抽出する条件
  • left joinは、テーブルAにあるすべての行と、テーブルAとテーブルBで結合する条件が一致したテーブルBの行を抽出します(図の黄色の部分)。
  • テーブルAのみにある行で、テーブルBのみにある列を表示するときは、NULLになります。
  • onの後に結合する条件を記述します。件数を絞る条件も追加できます。
  • whereは、結合されたデータ(※)に対して条件をつけて抽出します。
    (※オプティマイザにより結合前のデータを対象とする場合があります。)
  • left joinは、左外部結合と呼ばれます。left(左)のouter(外側)のjoin(結合)です。
  • outerは省略可能です。

 

left joinの使用例

次の2つのテーブルがあるとします。

salesテーブル
id price
1 300
2 400
3 200
productテーブル
id name
2 鉛筆
3 消しゴム
4 ノート

 

上記テーブルに対してleft joinを使用してデータを抽出します。

select 
  s.id,
  p.name,
  s.price
from sales s
  left join product p
on 
  s.id = p.id;

6行目は、left joinです。
8行目は、上記2つのテーブルにあるidを結合条件としています。

 

結果は、以下のとおりです。

id name price
1 NULL 300
2 鉛筆 400
3 消しゴム 200

2,3行目は、上記SQLの8行目の条件に一致した行です。
1行目は、salesテーブルのみにある行です。salesテーブルにない列の「name」の値はNULLになります。

 

on句の結合条件とwhere句の条件で絞る

left joinのon句の結合条件とwhere句の条件で絞るサンプルです。

select 
  s.id,
  p.name,
  s.price
from sales s
  left join product p
on 
  s.id = p.id
where 
  s.price > 300;

9行目は、where句です。抽出する条件を指定しています。
where句で右側のテーブル(product)の項目を指定する場合は、値がnullの場合があるので注意が必要です。

 

Oracleの場合 (+の記号)

Oracleの場合、(+)の記号で外部結合できます。

select 
  s.id,
  p.name,
  s.price
from 
  sales s,
  product p
where
  s.id = p.id(+);

6,7行目は、left joinがありません。
9行目に(+)の記号があります。この場合(+)の記号のない方のsalesテーブルの行はすべて抽出されます。

 

結合するテーブルが3つの場合

次の3つのテーブルがあるとします。

salesテーブル
id price company_cd
1 300 101
2 400 201
3 200 301
productテーブル
id name
2 鉛筆
3 消しゴム
4 ノート
companyテーブル
id name
101 A社
201 B社

 

上記テーブルに対してleft joinを使用してデータを抽出します。

select 
  s.id,
  p.name,
  s.price,
  c.name as company
from 
  sales s 
   left join product p
   on 
     s.id = p.id
   left join company c
   on
     s.company_cd = c.id;

salesテーブルに対してproductテーブルとcompanyテーブルを外部結合しています。

 

結果は、以下のとおりです。

id name price company
1 NULL 300 A社
2 鉛筆 400 B社
3 消しゴム 200 NULL

 

テーブル3つでOracleの場合 (+の記号)

テーブル3つでOracleの場合です。(+)の記号で外部結合できます。

select 
  s.id,
  p.name,
  s.price,
  c.name as company
from 
  sales2 s,
  product p,
  company c
where
  s.id = p.id(+) and
  s.company_cd = c.id(+);

7~9行目は、left joinはありません。
11,12行目に(+)の記号があります。
この場合(+)の記号のない方のsalesテーブルの行はすべて抽出されます。

 

right join(右外部結合)

select
   項目
from テーブルA
   right [outer] join テーブルB
on
   結合する条件
  • right joinは、テーブルBにあるすべての行と、テーブルAとテーブルBで結合する条件が一致したテーブルBの行を抽出します(図の黄色の部分)。
  • ほぼ使用されません。left joinが使用されます。
  • right joinは、右外部結合と呼ばれます。

right joinのサンプルです。

select 
  p.id,
  p.name,
  s.price
from sales2 s
  right join product p
on 
  s.id = p.id;

関連の記事

SQL INNER JOIN 内部結合のサンプル
SQL 自己結合のサンプル
SQL UNIONとUNION ALLのサンプル(結合して抽出)

△上に戻る