テーブル結合の説明
 テーブル結合は「内部結合」と「外部結合」があり、外部結合はさらに「左外部結合」と「右外部結合」の2種類があります。
 以下の 2 つのテーブルを使いこれらのテーブル結合を説明します。
テーブル BASE テーブル OPTION
id name age ext
1 いちろう 48 (NULL)
2 じろう 35 5002
3 さぶろう 26 5003
4 しろう 18 5004
NO ext history nickname
1 5001 1 イチ
2 5002 1 じー
3 5003 1 サブちゃん
4 5003 2 サブブ
 内部結合、外部結合に関わらず、結合は 2 つ以上のテーブルと結合の基準となる 1 つ以上の列をが必要になります。結合の基準となる列は結合条件と呼びます。
 ここでは BASE テーブルと OPTION テーブルを使い、結合条件は EXT 列とします。結合条件の列名は一致している必要はありません。
内部結合
BASE と OPTION の内部結合の結果を以下に示します。
(下部に SQL を記す)
ID NAME AGE EXT UPDATE NICKNAME
2 じろう 35 5002 1 じー
3 さぶろう 26 5003 1 サブちゃん
3 さぶろう 26 5003 2 サブブ
select BASE.ID, BASE.NAME, BASE.AGE, BASE.EXT, EXINFO.CLASSUP, EXINFO.NICKNAME from BASE join EXINFO on BASE.EXT=EXINFO.EXT ;
以下に内部結合のルールを示します。また、ルールによる動きを右に示します。
内部結合の場合 FROM 文で指定したテーブルを基準に結合する。 BASE テーブルが基準。
結合条件の列の値が一致するレコード同士を結合する。 BASE テーブルのレコード 2 と 3 の 5002 と 5003 が OPTION テーブルに存在。よって以下のようになる。
  • BASE テーブルのレコード 2 と OPTION テーブルのレコード 2 を結合。
  • (BASE テーブルのレコード 3 は次のルールを参照)
結合条件の列の値が複数一致する場合、それぞれと結合する。 EXINFO テーブルのレコード 3 ~ 4 と BASE テーブルのレコード 3 をそれぞれ結合。よって以下のようになる。
  • EXINFO テーブルのレコード 3 と BASE テーブルのレコード 3 を結合。
  • EXINFO テーブルのレコード 4 と BASE テーブルのレコード 3 を結合。
結合条件の列の値が NULL もしくは一致するレコードが存在しない場合は除外する。
  • BASE テーブルのレコード 1 は EXT が NULL のため除外。
  • BASE テーブルのレコード 4 の EXT 5004 は OPTION テーブルの EXT 列には存在しないため除外。
左 外部結合
BASE と OPTION の左外部結合の結果を以下に示します。
(下部に SQL を記す)
ID NAME AGE EXT UPDATE NICKNAME
2 じろう 35 5002 1 じー
3 さぶろう 26 5003 1 サブちゃん
3 さぶろう 26 5003 2 サブブ
1 いちろう 48 (NULL) (NULL) (NULL)
4 しろう 18 5004 (NULL) (NULL)
select BASE.ID, BASE.NAME, BASE.AGE, BASE.EXT, EXINFO.CLASSUP, EXINFO.NICKNAME from BASE left join EXINFO on BASE.EXT=EXINFO.EXT ;
以下に左外部結合のルールを示します。また、ルールによる動きを右に示します。
外部結合(左)の場合 FROM 文で指定したテーブルを基準に結合する。 BASE テーブルが基準。
結合条件の列の値が一致するレコード同士を結合する。 BASE テーブルのレコード 2 と 3 の 5002 と 5003 が OPTION テーブルに存在。よって以下のようになる。
  • BASE テーブルのレコード 2 と OPTION テーブルのレコード 2 を結合。
  • (BASE テーブルのレコード 3 は次のルールを参照)
結合条件の列の値が複数一致する場合、それぞれと結合する。 OPTION テーブルには EXT 5003 が 2 レコード存在。よって以下のようになる。
  • BASE テーブルのレコード 3 と OPTION テーブルのレコード 3 を結合。
  • BASE テーブルのレコード 3 と OPTION テーブルのレコード 4 を結合。
結合条件の列の値が NULL でも結合する。結合するレコードの列は全て NULL のレコード。
  • BASE テーブルのレコード 1 は EXT が NULL のため列が全て NULL のレコードと結合。
  • BASE テーブルのレコード 4(EXT 5004)は OPTION テーブルの EXT 列に存在しないため列が全て NULL のレコードと結合。
右・外部結合
BASE と OPTION の右外部結合の結果を以下に示します。
(下部に SQL を記す)
ID NAME AGE EXT UPDATE NICKNAME
2 じろう 35 5002 1 じー
3 さぶろう 26 5003 1 サブちゃん
3 さぶろう 26 5003 2 サブブ
(NULL) (NULL) (NULL) 5001 1 イチ
select BASE.ID, BASE.NAME, BASE.AGE, BASE.EXT, EXINFO.CLASSUP, EXINFO.NICKNAME from BASE right join EXINFO on BASE.EXT=EXINFO.EXT ;
以下に外部結合(右)のルールを記す。
  • 結合条件に指定した列が一致するレコード同士を結合する。(この例の場合、EXT 列)
  • 結合条件の列の値が複数存在する場合、それぞれと結合する。(この例の場合、EXT が 5003 の 2 レコードがそれぞれ結合する)
  • 結合条件の列が NULL でも結合する。存在しない ID と NAME、AGE は NULL となる。(この例の場合、EXT が 5001)
右外部結合の場合 JOIN 文で指定したテーブルを基準に結合する。 EXINFO テーブルが基準。
結合条件の列の値が一致するレコード同士を結合する。 EXINFO テーブルのレコード 2 ~ 4 の 5002 と 5003 が BASE テーブルに存在。よって以下のようになる。
  • EXINFO テーブルのレコード 2 と BASE テーブルのレコード 2 を結合。
  • EXINFO テーブルのレコード 3 と BASE テーブルのレコード 3 を結合。
  • EXINFO テーブルのレコード 4 と BASE テーブルのレコード 3 を結合。
結合条件の列の値が複数一致する場合、それぞれと結合する。 OPTION テーブルには EXT 5003 が 2 レコード存在。よって以下のようになる。
  • BASE テーブルのレコード 3 と OPTION テーブルのレコード 3 を結合。
  • BASE テーブルのレコード 3 と OPTION テーブルのレコード 4 を結合。
結合条件の列の値が NULL でも結合する。結合するレコードの列は全て NULL のレコード。
  • BASE テーブルのレコード 1 は EXT が NULL のため列が全て NULL のレコードと結合。
  • BASE テーブルのレコード 4(EXT 5004)は OPTION テーブルの EXT 列に存在しないため列が全て NULL のレコードと結合。
左・外部結合 & 特定レコードに絞り込む
ID NAME AGE EXT UPDATE NICKNAME
2 じろう 35 5002 1 じー
3 さぶろう 26 5003 2 サブブ
(NULL) (NULL) (NULL) (NULL) 1 イチ
with in2 as (select EXT, max(CLASSUP) CLASSUP from EXINFO group by EXT), in3 as (select EXINFO.EXT, EXINFO.CLASSUP, EXINFO.NICKNAME from EXINFO join in2 on EXINFO.EXT=in2.EXT and EXINFO.CLASSUP=in2.CLASSUP) select BASE.ID, BASE.AGE, BASE.EXT, in3.CLASSUP, BASE.NAME, in3.NICKNAME from BASE right join in3 on BASE.EXT=in3.EXT ;