| 内部結合 |
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,
OPTION.CLASSUP,
OPTION.NICKNAME
from BASE
join OPTION on BASE.EXT=OPTION.EXT
; ※JOIN を使わない旧式の記述。
FROM にテーブル名をカンマ「,」区切りで並べる。
WHERE に結合条件を記述する。 select BASE.ID,
BASE.NAME,
BASE.AGE,
BASE.EXT,
OPTION.CLASSUP,
OPTION.NICKNAME
from BASE, OPTION
where BASE.EXT=OPTION.EXT
; |
以下に内部結合のルールを示します。また、ルールによる動きを右に示します。
| ・ |
内部結合の場合 FROM 文で指定したテーブルを基準に結合する。 |
BASE テーブルが基準。 |
| ・ |
結合条件の列の値が一致するレコード同士を結合する。 |
BASE テーブルのレコード 2 と 3 の 5002 と 5003 が OPTION テーブルに存在。よって以下のようになる。
- BASE テーブルのレコード 2 と OPTION テーブルのレコード 2 を結合。
- (BASE テーブルのレコード 3 は次のルールを参照)
|
| ・ |
結合条件の列の値が複数一致する場合、それぞれと結合する。 |
OPTION テーブルのレコード 3 ~ 4 と BASE テーブルのレコード 3 をそれぞれ結合。よって以下のようになる。
- OPTION テーブルのレコード 3 と BASE テーブルのレコード 3 を結合。
- OPTION テーブルのレコード 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,
OPTION.CLASSUP,
OPTION.NICKNAME
from BASE
left join OPTION on BASE.EXT=OPTION.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,
OPTION.CLASSUP,
OPTION.NICKNAME
from BASE
right join OPTION on BASE.EXT=OPTION.EXT
;
|
以下に外部結合(右)のルールを記す。
- 結合条件に指定した列が一致するレコード同士を結合する。(この例の場合、EXT 列)
- 結合条件の列の値が複数存在する場合、それぞれと結合する。(この例の場合、EXT が 5003 の 2 レコードがそれぞれ結合する)
- 結合条件の列が NULL でも結合する。存在しない ID と NAME、AGE は NULL となる。(この例の場合、EXT が 5001)
| ・ |
右外部結合の場合 JOIN 文で指定したテーブルを基準に結合する。 |
OPTION テーブルが基準。 |
| ・ |
結合条件の列の値が一致するレコード同士を結合する。 |
OPTION テーブルのレコード 2 ~ 4 の 5002 と 5003 が BASE テーブルに存在。よって以下のようになる。
- OPTION テーブルのレコード 2 と BASE テーブルのレコード 2 を結合。
- OPTION テーブルのレコード 3 と BASE テーブルのレコード 3 を結合。
- OPTION テーブルのレコード 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 OPTION
group by EXT),
in3 as (select OPTION.EXT,
OPTION.CLASSUP,
OPTION.NICKNAME
from OPTION
join in2 on OPTION.EXT=in2.EXT
and OPTION.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
;
|
|