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つのテーブルがあるとします。
id | price |
---|---|
1 | 300 |
2 | 400 |
3 | 200 |
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つのテーブルがあるとします。
id | price | company_cd |
---|---|---|
1 | 300 | 101 |
2 | 400 | 201 |
3 | 200 | 301 |
id | name |
---|---|
2 | 鉛筆 |
3 | 消しゴム |
4 | ノート |
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のサンプル(結合して抽出)