はじめに
今日は、リレーショナルデータベースでよく使われる「結合演算」についてまとめます。
結合演算には、θ結合、等結合、自然結合、外部結合など様々な種類があります。基本的な考え方としては、まず2つの関係(テーブル)の直積を取り、その中から条件を満たすタプル(行)を選択し、不要な列を射影していくことで目的の結果を得ます。
本文
ここでは、サンプルとして以下の2つのテーブルRとSを用います。
Rテーブル
A | B |
---|---|
1 | X |
2 | Y |
3 | Z |
Sテーブル
A | C |
---|---|
2 | Q |
3 | R |
4 | S |
θ結合
θ結合は、直積から2つの属性に対し、<, >, <=, >=, =, <>(等しくない)
などの比較演算子を用いて選択したタプル集合を得る結合です。R.A > S.A を条件としたθ結合の場合、RとSの直積からR.A > S.Aを満たす行のみ取り出します。
SQL
SELECT * FROM R INNER JOIN S ON R.A > S.A;
R×Sは以下のような直積になります(Rが3行、Sが3行なので計9行)
R.A | R.B | S.A | S.C |
---|---|---|---|
1 | X | 2 | Q |
1 | X | 3 | R |
1 | X | 4 | S |
2 | Y | 2 | Q |
2 | Y | 3 | R |
2 | Y | 4 | S |
3 | Z | 2 | Q |
3 | Z | 3 | R |
3 | Z | 4 | S |
ここからR.A > S.Aを満たす行を抽出すると、3 > 2
が真なので (3,Z,2,Q)
のみが選ばれます。
結果
R.A | R.B | S.A | S.C |
---|---|---|---|
3 | Z | 2 | Q |
等結合 (Equi-join)
θ結合で比較演算子が"="の場合が等結合です。
SQL
SELECT * FROM R INNER JOIN S ON R.A = S.A;
結果
R.A = S.Aを満たすのはA=2とA=3のペア
R.A | R.B | S.A | S.C |
---|---|---|---|
2 | Y | 2 | Q |
3 | Z | 3 | R |
自然結合 (Natural join)
自然結合は等結合から、2つの関係の共通属性を1つ除いて射影演算を行ったものです。
R.AとS.Aが等しい行を結合し、A列を1つにまとめます。
SQL
SELECT * FROM R, S ON R.A = S.A
-- or
SELECT * FROM R NATURAL JOIN S; -- 一部のDBでNATURAL JOINが使用可能
結果
等結合結果から共通属性Aを1つにまとめる
A | B | C |
---|---|---|
2 | Y | Q |
3 | Z | R |
外部結合(Outer join)
内部結合(INNER JOIN)は対応する行が両方に存在する場合のみ取り出しますが、外部結合(OUTER JOIN)は、一方のテーブルに該当行がなくてもその側の行は残し、相手側に値がなければNULLを補います。
左外部結合
左外部結合では、左側(FROM句で左に書いた)のテーブルRは全行保持し、Sに一致がなければNULLを補います。
SQL
SELECT R.A, R.B, S.C FROM R LEFT OUTER JOIN S ON R.A = S.A;
結果
RにA=1があるがSにA=1はないため、その行はNULLを補います。
A | B | C |
---|---|---|
1 | X | NULL |
2 | Y | Q |
3 | Z | R |
右外部結合
右外部結合は右側のテーブルSを基準に全行保持し、Rで一致しない行にはNULLを補います。
SQL
SELECT R.A, R.B, S.C FROM R RIGHT OUTER JOIN S ON R.A = S.A;
結果
SにA=4があるがRにA=4はないため、S側は保持してR側にNULLを補います。
A | B | C |
---|---|---|
2 | Y | Q |
3 | Z | R |
NULL | NULL | S |
完全外部結合
共通属性に関し、どちらかの列に存在する行を全て取り出す結合です。
SQL
SELECT R.A, R.B, S.C FROM R FULL OUTER JOIN S ON R.A = S.A;
結果
A | B | C |
---|---|---|
1 | X | NULL |
2 | Y | Q |
3 | Z | R |
NULL | NULL | S |
まとめ
結合演算は、複数の関係を関連付け、必要な情報を1つの結果セットとして取得するための基本手法です。さまざまなニーズに応じて使い分けることができます。明日はデータベース設計についてまとめます!