関係代数(かんけいだいすう、リレーショナル代数、英: relational algebra)は、関係データベースの関係モデル (リレーショナルモデル)において、集合論と一階述語論理に基づいて、関係 (リレーション、表、テーブル)として表現されたデータを扱う、コンピュータ科学における代数的な演算の体系である。

関係として表現されたデータに対して行う演算体系としては、関係論理(関係計算)とこの項目で説明する関係代数の2種類が知られている。
関係代数と関係論理は、主にエドガー・F・コッドによって考案され、その後コッドを含めた関係データベース(関係モデル)の研究者たちが発展させてきた。

現在では、関係代数の演算子としては、和、差、交わり (交差) 、直積、制限 (選択) 、射影、結合、商の8種類が言及されることが多い。
ただし属性名変更や拡張、要約などこの他の演算子も考案されている。

関係代数を実装したデータベース言語(問い合わせ言語)としては、SQL や Tutorial D などが挙げられる。
ただし SQL については、関係代数を完全な形で実装していないとして批判する意見がある。

数学的に純粋な関係代数は、数理論理学や集合論と比較して、代数的構造をなしている。

## 概要

関係代数の基本的な考え方は、集合論と一階述語論理の流れをくんでいる。

関係代数の演算子は、閉包性(closure)をもつ。関係において閉包である。
つまり次のことがいえる。

- 関係代数は、1つもしくは複数の関係を基にして演算を行う。
- 関係代数で演算を行って返される結果は、必ず関係である。
- 関係代数演算の結果として返された関係を基にして、さらに関係代数で演算することができる。入れ子になった関係代数演算を行うことができる。

現在、言及されることが多い関係代数の演算子としては、和、差、交わり (交差) 、直積、制限 (選択) 、射影、結合、商の8種類がある(この8種類の演算子については後の#基本的な演算子の節で説明する)。
ただし属性名変更や拡張、要約などこの他の演算子も考案されている(後の#応用的な演算子の節で説明する)。

関係代数は、関係データベース管理システム(RDBMS、関係データベース)のデータベース言語(問い合わせ言語)の基礎となっている。

関係代数と関係論理(関係計算)は互いに等価である。
関係代数で表現された式は、等価な関係論理の式で表現することができる。
また関係論理で表現された式は、等価な関係代数の式で表現することができる。

関係代数を実装したデータベース言語としては、SQL や Tutorial D などが挙げられる。
SQLは、関係代数と関係論理を実装しているとされる。
ただし一部の研究者などの人々(クリス・デイトやヒュー・ダーウェンなど)は、SQLに対して、関係モデルを考案したエドガー・F・コッドの関係代数を完全な形で実装していないなどとして、批判的な立場をとっている。
デイトとダーウェンは完全な実装として D(Tutorial D)を考案し提唱している。

関係は何らかの述語の外延と解釈することができるので、関係代数の各々の演算子は述語計算に相当するものと解釈できる。
例えば、自然結合は論理積 AND($\land$)に相当する。
関係 R と関係 S があり、それぞれ述語 p1 と述語 p2 の外延を表現したものとすると、R と S の自然結合(R $\bowtie$ S)は、述語 p1 $\land$ p2 の外延を表現する。

関係代数の演算子の正確な集合は、関係代数の定義により異なり得る。
また関係代数の演算子の正確な集合は、名前付けを行わない関係モデル(数学的な関係を採用している)を使うか、それとも名前付けを行う関係モデル(数学的な関係の名前付けによる一般化を採用している)を使うか、ということにも依存している。
この項目の説明では、名前付けを行う関係モデルを使うことにする。
名前付けを行う関係モデルは、コッドが提唱したものであり、一定の人々によりコッドの最も重要な革新的業績と考えられている。
こうした人々による肯定的な評価は、コッドが自分の関係モデルから関係の属性の順序という概念を除外したことが大きな理由である。
このモデルでは組(タプル)は、属性名の集合から属性値の集合を導出する部分関数である。
この項目の説明では、組 t の属性 a を t(a) と記述する。

コッドの関係代数が一階述語論理に関しては実際には完全ではないと留意しておくことは、重要である。
仮に一階述語論理に関して完全であったならば、関係モデルをどのように実装するにせよ、コンピュータ上の克服できない困難に突き当たってしまうであろう。
こうした困難を克服するためにコッドは、関係代数の演算対象を有限の関係のみに限定し、また否定(NOT)と選言 (OR)を限定的にサポートすることを提唱した。
コッドの関係代数は、実際にはホーン節で再帰と否定の無い一階述語論理のサブセットである。
こうした限定に類することは、他の多くの論理に基づくコンピュータ言語においてもみられることである。

コッドは、関係データベース言語の表現能力について関係完備という用語を定義した。
関係完備とは、コッドが提唱した限定のもとで、一階述語論理に関して完全な言語であることを意味する。
実際にコッドが提唱した限定は、コッドの関係代数をデータベースのさまざまな目的に適用することにおいて、不都合は無かった。
関係代数は関係完備である。
関係代数と同等もしくは同等以上の表現能力を持つ関係データベース言語は関係完備であるといえる。
関係論理(関係計算)は、関係代数と同等の表現能力を持つため、関係完備である。
なお関係論理には定義域関係論理と組関係論理がある。

どのような代数であれ、一定の数の演算子は基本的  であり、それ以外の演算子は、基本的な演算子のみをもって定義できるため、基本的ではない。
関係代数における基本的な演算子の選択が、論理学における基本的な演算子の選択と似ているならば、利便である。
AND、OR および NOT の論理における基本的な演算子の選択は恣意的であることはよく知られているが、コッドは自分の関係代数において恣意的な選択をした。
コッドは関係代数において次の6つの基本的な演算子を定めた。

- 制限(選択)
- 射影
- 直積(直積集合)
- 和(和集合)
- 差(差集合)
- 属性名変更

(実際にはコッドは属性名変更を基本的な演算子群から除去した。しかし属性名変更を含めた例として後の#歴史の節で述べる ISBL が存在する)
この6つの演算子は、表現能力を損なうこと無くこの6つのいずれをも除くことはできないという意味で、関係代数の基盤をなす。
他の多くの演算子がこの6つの演算子を基にして定義されてきた。
この6つの演算子を基にして定義された演算子のうち非常に重要なものは、交わり(交差、共通部分)、商、自然結合である。
実際に ISBL は直積を自然結合で置き換えるという重要な事例を残した。
直積は自然結合から退化した演算である。

## 関係論理との対比

例えば関係代数では、書籍データベースから次の手順で、特定の書名の書籍を在庫としてもつ書店の店名と電話番号を問い合わせるであろう。

1. 書籍関係と書名関係を書店IDで結合する。
2. 結合して生成された関係を指定された書名で制限する。
3. 制限して生成された関係を店名と電話番号で射影する。

この例の問い合わせは関係論理(関係計算)では次のような宣言的に定式化できる。

書籍データベースにおいて、書籍関係と書名関係のそれぞれの書店IDが同一であるものとし、指定された書名をもつ店名と電話番号を取得する。

## 歴史

関係代数は、エドガー・F・コッドが1969年に関係モデルを考案するまで、世間ではほとんど興味を持たれなかった。
コッドは関係代数をデータベース言語(問い合わせ言語)の基礎として提唱した。
コッドの関係代数に基づいて実装された最初のデータベース言語は、IBMの ISBL(Information Systems Base Language)であった。
ISBL は PRTV(Peterlee Relational Test Vehicle)という関係データベース管理システム(RDBMS、関係データベース)のデータベース言語である。
ISBL の開拓的な作業はデータベース分野の権威たちの多くにより、コッドの構想を使い勝手の良い言語に実装する道筋をつけたとして、称賛されている。
その後、ISBL という実装を引き継いだ IBM Business System 12 という RDBMS は業界で短期間の影響力をもった。
1998年にクリス・デイトとヒュー・ダーウェンは Tutorial D というデータベース言語を提唱した。
Tutorial D は、関係データベース理論を学習するために使われることを想定していた。
また Tutorial D は ISBL の基本的な考え方を利用している。
Rel という RDBMS は Tutorial D を実装している。
データベース言語 SQL は、関係代数に不完全ながらある程度基づいている。
SQL の演算対象となる表(テーブル)は厳密に関係と呼べるものではなく、また関係代数におけるいくつかの便利な法則も SQL では活用できない(そのため関係代数式の最適化、オプティマイザおよびデータベース利用者に大きな損失を与えている)。

## 関係モデル

関係代数は関係モデルに基づく関係データベースのデータベース言語 (問い合わせ言語) であるため、最初に関係モデルを簡単に定義する。
関係モデルにおける基本的な構成要素は定義域すなわちデータ型である。
組は順序づけられていない属性の集合である。
属性は定義域と値のペアである。
関係変数は、特定の関係型の名前つきの変数であり、順序づけられていない属性名と属性の定義域のペアの集合である。
関係変数は関係の見出しを提供する。
関係は見出しと組の集合から構成される。
こうした関係モデルの概念は数学的に定義されるが、既存のデータベースの実装はこうした定義に厳密に準拠しているわけではない。
表 (テーブル) は、関係の視覚的表現として受け容れられている。
組は行の概念に似ている。

## 関係の型適合

集合論に基づく関係演算子(直積を除く、和、差、交わり)では、2つの型適合(type-compatibility)する関係を対象として演算を行う。
この種の関係演算では、型適合しない2つ関係を対象として演算を行うことはできない。
型適合は、和両立(union-compatibility)ともいう。

関係の型適合とは、言い換えれば2つの関係がうまく組み合わせることができるということである。
具体的には、関係 R と関係 S について、次の条件が満たされる場合、R と S は型適合である。

- R と S が同じ数の属性をもっていること。
- R と S がもつ属性の名前が同じであること。
- R と S がもつ同じ名前の属性の定義域が同じであること。

## 基本的な演算子

基本的な関係代数の演算子は大きく2つに分類することができる。
集合論に基づく演算子と関係代数に特有な演算子である。
まず集合論に基づく演算子(和、差、交わり (交差) 、直積)を説明し、続けて関係代数特有の演算子(制限 (選択) 、射影、結合、商)を説明する。
また各演算子について、データベース言語(問い合わせ言語)SQL と Tutorial D による関係代数式の表現例を示す。

### 和

和(union)演算 R ∪ S は、R と S を、R の全ての組(タプル、行)と S の全ての組で構成される一つの関係を返す。
この演算では、R と S が型適合であることが前提となる。
重複する組は除去される。

参考: 和集合

#### 前提

関係 R と S が型適合であること。

#### 例

|  |  |  |
| --- | --- | --- |
|  |  |  |

#### 定義

|  |
| --- |
| $R\cup S:=\{t|t\in R\lor t\in S\}$ |

#### SQL

R UNION S

#### Tutorial D

R UNION S

### 差

差(difference)演算 R − S は、R から、S に属する組を取り除いた関係を返す。
この演算では、R と S が型適合であることが前提となる。

参考: 差集合

#### 前提

関係 R と S が型適合であること。

#### 例

|  |  |  |
| --- | --- | --- |
|  |  |  |

#### 定義

|  |
| --- |
| $R-S:=\{t|t\in R\land t\notin S\}$ |

#### SQL

R EXCEPT S

#### Tutorial D

R MINUS S

### 交わり

交わり(交差、共通、積、intersection)演算 R ∩ S は、R と S の両方に属する組から関係を返す。
この演算では、R と S が型適合であることが前提となる。
交わり演算と等価な演算を、差演算を使って表現することができる。

R ∩ S = R − (R − S)

参考: 共通部分

#### 前提

関係 R と S が型適合であること。

#### 例

|  |  |  |
| --- | --- | --- |
|  |  |  |

#### 定義

|  |
| --- |
| $R\cap S:=\{t|t\in R\land t\in S\}$ |

#### SQL

R INTERSECT S

#### Tutorial D

R INTERSECT S

### 直積

直積(積、デカルト積、cartesian product)演算 R × S は、R と S の組の全ての組み合わせの関係(デカルト積)を返す。
言い換えると、R がもつ全ての組が、S のもつ全ての組と、組み合わせられる。
直積演算では、R と S が型適合である必要は無い。
直積演算 R × S の組の数は、R の組の数と S の組の数を、掛け算した数になる。
直積演算 R × S の属性の数は、R の属性の数と S の属性の数を、足し算した数になる。

参考: 直積集合

#### 前提

関係 R と S に共通の属性名が無いこと。

#### 例

|  |  |  |
| --- | --- | --- |
|  |  |  |

#### 定義

任意の2つの関係 $R={(a_{1},a_{2},...,a_{n})}$ と $S={(b_{1},b_{2},...,b_{m})}$ について、直積は次のように定義される。

|  |
| --- |
| $R\times S:=\{(a_{1},a_{2},...,a_{n},b_{1},b_{2},...,b_{m})|(a_{1},a_{2},...,a_{n})\in R\wedge (b_{1},b_{2},...,b_{m})\in S\}$ |

#### SQL

SELECT \* FROM R, S

#### Tutorial D

直接にはサポートされない。

### 制限

制限(restriction)は、選択(selection)ともいい、ある関係から、指定した条件に合う組の集合を関係として返す。

#### 前提

どの条件式の要素も比較可能であり、比較演算子θを使って条件式が記述されていること。

#### 例

|  |  |  |
| --- | --- | --- |
|  |  |  |

#### 定義

Rを関係とすると、制限は次のように定義される。

|  |
| --- |
| $\sigma _{\varphi }(R):=\{\ t:t\in R,\ \varphi (t)\ \}$ |

$\varphi$ は次のような条件式である。
なお、θは一般的な比較演算子 (<、≤、=、>、≥、<>) である。

- 属性と定数の比較の条件式: 属性 θ 定数
- 属性同士の比較条件式: 属性 θ 属性
- 比較条件式に論理演算記号 (∧、∨、¬) を適用したもの

#### SQL

SELECT \* FROM R WHERE A = 1

#### Tutorial D

R WHERE A = 1

### 射影

射影(projection)演算は、ある関係から属性を限定した関係を返す。
射影演算は、Rを構成する属性集合から、いくつかの属性を抽出する。
βを抽出する属性の集合とすると、射影は、πβ(R) もしくは R[β] と記述することができる。

#### 前提

射影演算で指定された属性が、対象となる関係に含まれていること。

#### 例

|  |  |  |
| --- | --- | --- |
|  |  |  |

#### 定義

Rを関係とし、Rは {A1, ..., Ak} として属性をもつとする。
また、β ⊆ {A1, ..., Ak} とする (βはRの全属性の部分集合である属性の集合) 。

|  |
| --- |
| $\pi _{\beta }(R):=\{t_{\beta }|t\in R\}$ |

tβ := (β) は、βを構成する属性集合だけからなる組を意味する。

#### SQL

SELECT A, B FROM R

#### Tutorial D

R { A, B }

### 結合

結合 (join) は、2つの関係から1つの関係を返す演算であり、直積演算と制限演算を組み合わせた演算に相当する。
一般に、結合を直積演算と制限演算の組み合わせと考えると、この制限演算の制限条件は、A θ B の普通の属性比較が真となるという条件である(θは行おうとする結合演算に応じた比較演算子)。
θ比較の比較演算子は、<、≤、=、>、≥、<> である。
この一般化された結合演算の概念は、θ結合(シータ結合)とも呼ばれる。
一般化された結合演算であるθ結合を具象化した演算として、この節で述べる等結合、自然結合、準結合(半結合)などがある。
この他に外結合(外部結合)も考案されているが、外結合の妥当性については議論の対象となっており、後の節で説明する。

#### 前提

関係 R と S に共通の属性名が無いこと。

#### 例

|  |  |  |  |
| --- | --- | --- | --- |
|  |  |  |  |

#### 定義

関係$R(A_{1},...,A_{n},B_{1},...,B_{n})$ と関係$S(B_{1},...,B_{n},C_{1},...,C_{n})$ のθ結合は、次のように定義される。
なお、θ比較式を expression とする。

|  |
| --- |
| $R\triangleright \!\!\triangleleft \,_{\mathrm {expression} }S:=\{r\cup s|r\in R\land s\in S\land \mathrm {expression} \}$ |

この定義を演繹すると次のように表現できる。

|  |
| --- |
| $R\triangleright \!\!\triangleleft \,_{\mathrm {expression} }S:=\sigma _{\mathrm {expression} }(R\times S)$ |

#### 等結合

等結合(equijoin)は、θ結合においてθ比較の比較演算子が「 = 」である結合演算である。

##### 例

|  |  |  |  |
| --- | --- | --- | --- |
|  |  |  |  |

##### 定義

関係Rと関係Sがあり、これらの関係内の属性集合A、Bについて A ∈ R、B ∈ S とすると、等結合は次のように定義される。

|  |
| --- |
| $R\triangleright \!\!\triangleleft \,_{A=B}S:=\{r\cup s|r\in R\land s\in S\land r_{[A]}=s_{[B]}\}$ |

#### 自然結合

自然結合(natural join)は⋈と書かれる二項演算で、2つの関係に共通の属性の値が等しいすべての組み合わせからなる関係を返す。
2つの関係に共通の属性がない場合、これは直積に等しくなる。
自然結合では交換法則と結合法則が成り立つ。
すなわち、$R\triangleright \!\!\triangleleft \,S=S\triangleright \!\!\triangleleft \,R$ であり、$(R\triangleright \!\!\triangleleft \,S)\triangleright \!\!\triangleleft \,T=R\triangleright \!\!\triangleleft \,(S\triangleright \!\!\triangleleft \,T)$ である。
関係代数演算において、この交換法則と結合法則はクエリ最適化のために活用することができる。

#### 前提

なし。

##### 例

|  |  |  |
| --- | --- | --- |
|  |  |  |

従業員と部署の共通の属性は部署名であり、従業員⋈部署には部署名が同じになる組み合わせが含まれている。
従業員の(メアリー,1257,人事)と部署の(生産,チャールズ)は部署名が同じになる組み合わせがないため従業員⋈部署には含まれず、部署の(ファイナンス,ジョージ)と(販売,ハリエット)は部署名が同じになる組み合わせが複数あるため従業員⋈部署に複数回登場する。

##### 定義

関係$R(A_{1},...,A_{n},B_{1},...,B_{n})$ と関係$S(B_{1},...,B_{n},C_{1},...,C_{n})$ の自然結合は次のように定義される。

|  |
| --- |
| $R\triangleright \!\!\triangleleft \,S:=\{r\cup s_{[C_{1},...,C_{n}]}|r\in R\land s\in S\land r_{[B_{1},...,B_{n}]}=s_{[B_{1},...,B_{n}]}\}$ |

##### SQL

R NATURAL JOIN S

##### Tutorial D

R JOIN S

#### 準結合

準結合(半結合、semijoin)は、自然結合に似た二項演算R⋉Sで、自然結合R⋈Sの属性をRに含まれているもののみに射影した関係を返す。

##### 例

|  |  |  |
| --- | --- | --- |
|  |  |  |

##### 定義

関係$R(A_{1},...,A_{n},B_{1},...,B_{n})$ と関係$S(B_{1},...,B_{n},C_{1},...,C_{n})$ の準結合は、次のように定義される。

|  |
| --- |
| $R\ \triangleright \!\!\!<S:=\{r|r\in R\land s\in S\land r_{[B_{1},...,B_{n}]}=s_{[B_{1},...,B_{n}]}\}$ |

### 商

商(division)演算 R ÷ S は、 R に固有の属性名に対する R のタプルの制限、つまりRの属性ではあるがSの属性ではなく、 Sのタプルとのすべての組み合わせがRに存在するという制限で構成されている。
商は直積演算とは対称となる逆の演算と考えることができる。
関係Rと関係Sがあり、$\beta$ を R の属性集合、$\gamma$ を S の属性集合とする。
$\beta \cap \gamma =\varnothing$ が成立する場合、次のようになる。

$T=R\times S$
$T\div S=R$

#### 例

関係Rがあり、R の属性として father、mother、child、age があるとする。
さらに関係Sがあり、S の属性として child、age があるとする。
S には Maria(4歳)と Sabine(2歳)のデータが存在する。
R を S で商を求めると、一つの関係が結果として返される。
この結果として返された関係は、Maria(4歳)と Sabine(2歳)を娘としてもつ夫婦のみで構成される関係である。

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
|  |  | R÷S:  | father | mother | | --- | --- | | Martin | Melanie | |

#### 定義

商は、演繹して導き出される演算子であるため、関係代数の他の演算子を使って定義される。
関係 R と S があり、$\beta$ を R の属性集合、$\gamma$ を S の属性集合とし、$R'$ を次のとおりとする。$R':=\beta \setminus \gamma$

このとき、商は次のとおり定義される。

$R\div S:=\pi _{R'}(R)-\pi _{R'}((\pi _{R'}(R)\times S)-R)$

#### SQL

SQLでは、直接、商を求める機能は、提供されていない。
商演算を行うには複雑な問い合わせを記述する必要がある。

#### Tutorial D

R DIVIDEBY S

## 応用的な演算子

先述の8つの関係代数演算子よりも後の時期に考案された演算子を説明する。
先の節と同様に各演算子について、データベース言語 (問い合わせ言語) SQL と Tutorial D による関係代数式の表現例を示す。

### 属性名変更

属性名変更(rename)は、関係の属性の名前を変更する演算である。
この演算子は次に述べるとおり重要である。

- さまざまな関係の結合演算を可能とする。
- 同じ属性名を持つ2つの関係を元にする直積演算を可能とする。とりわけ同じ関係同士でも直積演算を可能とする。
- さまざまな属性を持つ2つの関係を元にして多くの関係代数演算を可能とする。

属性名変更は次のように記述する。

$\beta _{[\mathrm {new} \leftarrow \mathrm {old} ]}(R)$ もしくは R[old→new]

#### 例

|  |  |
| --- | --- |
|  |  |

#### 定義

属性名変更により返される組の集合を  t'  とすると、属性名変更は次のように定義される。

$\beta _{[\mathrm {new} \leftarrow \mathrm {old} ]}(R):=\{t'|t'(R-\mathrm {new} )=t(R-\mathrm {old} )\land t'(\mathrm {new} )=t(\mathrm {old} )\}$

#### SQL

SELECT A, B AS X, C FROM R

#### Tutorial D

R RENAME ( B AS X )

### 拡張

拡張(extend)は、ある関係に何らかの式に基づいて算出される新たな属性が、追加された関係を返す演算である。

#### 例

関係Rについて、Rの属性Bがインチ単位で示されているとして、センチメートル単位の値を求める場合。

|  |  |
| --- | --- |
|  |  |

#### SQL

SELECT A, B, (B \* 2.54) AS X FROM R

#### Tutorial D

EXPAND R ADD (B \* 2.54 AS X)

### 要約

多くの関係データベース管理システム(RDBMS、関係データベース)では次の5つの要約(summarize)の機能を使うことができる。

- sum(合計値)
- count(演算対象となる関係の組の数)
- average(平均値)
- maximum(最大値)
- minimum(最小値)

#### 例

関係Rについて、Rの属性AとAにおけるBの最大値を求める。

|  |  |
| --- | --- |
|  |  |

#### SQL

SELECT A, MAX(B) AS X FROM R GROUP BY A

#### Tutorial D

SUMMARISE R PER ( R{A} ) ADD ( MAX(B) AS X )

### 外結合

先述した通常の結合(内結合)が結合対象となる2つの関係の組を対応づけて関係を返すのに対し、外結合(外部結合、outer join)は、内結合により返される組に加え、外結合の対象となる関係の組で内結合により対応づけられる組が存在しない組についても、存在しない部分を null という値ないし印で満たして、外結合の結果として返される関係に追加する。

3種類の外結合が定義されている。
すなわち左外結合、右外結合、完全外結合の3種類がある(「外」の字は省略される場合がある)。

外結合については、関係モデルにおける null を否定する立場などから、導入すべきでないとの意見があり、議論の対象となっている。
Tutorial D では外結合に相当する機能は無い。

null についてはここでは説明せず、外結合で満たされるべき場所に割り当てる概念である、と述べるにとどめる。
ここで述べる null は、データベース言語 SQL における NULL であるとの前提をしない。
また null は値ではなく印であるとの前提や、賛否両論のある三値論理を導入するとの前提もしない。

#### 左外結合

関係Rと関係Sがある場合の左外結合(左外部結合、左結合、left outer join) R =X S を考える。
左外結合の結果として返される関係は、 R と S においてこの2つの関係に共通する名前の属性の属性値が全て互いに等しい組の集合に加え(大雑把な表現だが)、Rの組でSに対応づけられない組の集合から、構成される関係である。

##### 例

この例で R と S で共通の名前を持つ属性に関して S に共通する組が無い R の組については、左外結合で返される関係においては null の値が設定される。
R で属性 A の値が 4 である組については、対応する S の組が無いため、左外結合で返される関係で、null が出現している。

|  |  |  |
| --- | --- | --- |
|  |  |  |

数学的には、左外結合は自然結合と集合和とで模擬実行できる。

R =X S = R ∪ (R$\bowtie$S)

##### SQL

R LEFT OUTER JOIN S

#### 右外結合

右外結合(右外部結合、右結合、right outer join)は左外結合とほとんど同じ振る舞いをするが、左外結合の場合とは逆に、右外結合の対象となる2つの関係のうち2番目の関係に現れる組に相当する組が、右外結合の結果として返される関係に全て現れるという点で異なっている。
関係Rと関係Sがある場合の右外結合 R X= S を考える。
右外結合の結果として返される関係は、 R と S においてこの2つの関係に共通する名前の属性の属性値が全て互いに等しい組の集合に加え、Sの組でRに対応づけられない組の集合から、構成される関係である。

##### 例

この例で R と S で共通の名前を持つ属性に関して R に共通する組が無い S の組については、右外結合で返される関係においては null の値が設定される。
S で属性 A の値が 10 である組については、対応する R の組が無いため、完全外結合で返される関係で、null が出現している。

|  |  |  |
| --- | --- | --- |
|  |  |  |

数学的には、右外結合は自然結合と集合和とで模擬実行できる。

R X= S = S ∪ (R$\bowtie$S)

##### SQL

R RIGHT OUTER JOIN S

#### 完全外結合

完全外結合(完全外部結合、完全結合、単に外結合ともいう、full outer join)の結果として返される関係は、実際には左外結合と右外結合の結果を組み合わせた関係である。
関係Rと関係Sがある場合の完全外結合 R =X= S を考える。
完全外結合の結果として返される関係は、 R と S においてこの2つの関係に共通する名前の属性の属性値が全て互いに等しい組の集合に加え、Rの組でSに対応づけられない組の集合と、Sの組でRに対応づけられない組の集合から、構成される関係である。

##### 例

この例で R と S で共通の名前を持つ属性に関して、S に共通する組が無い R の組、および R に共通する組が無い S の組については、完全外結合で返される関係においては null の値が設定される。
R で属性 A の値が 4 である組については、対応する S の組が無いため、完全外結合で返される関係で、null が出現している。
また S で属性 A の値が 10 である組については、対応する R の組が無いため、完全外結合で返される関係で、null が出現している。

|  |  |  |
| --- | --- | --- |
|  |  |  |

数学的には、完全外結合は左外結合と右外結合 (したがって自然結合と集合和) とで模擬実行できる。

R=X=S = (R=XS) ∪ (RX=S) or R=X=S = R ∪ S ∪ (R ⋈ S)

##### SQL

R FULL OUTER JOIN S

## 問い合わせ最適化

関係代数と関係群に対する問い合わせの最適化について説明する。

関係群に対する問い合わせは木構造として表現される。
その木構造において、

- 節は関係代数演算子である。
- 葉は関係である。
- 部分木は部分関係代数式である。

最適化の第一の目標は、関係代数式を、木構造内の部分木により与えられる部分関係代数式が生成する関係の平均的な大きさを、最適化前の関係代数式が生成する関係の平均的な大きさより小さくする、同等な関係代数式に変換することである。
第二の目標は、一つの問い合わせ内において複数回出現する共通の部分関係代数式を同定することであり、また同時に複数の問い合わせが評価される際、それら全ての問い合わせにおいて複数回出現する共通の部分関係代数式を同定することである。
第二の目標で複数回出現する共通の部分関係代数式を同定することにより、一度その部分関係代数式を計算すれば、その計算結果を同じ部分関係代数式が出現し評価する際に再利用すれば良く、問い合わせにおいて再度同じ部分関係代数式を計算する必要は無くなる。

次に木構造のこうした変換における法則群を説明する。

参考: クエリ最適化

### 最適化における制限演算

制限演算に関する法則は、問い合わせ最適化において大きな役割を果たす。
制限演算は、演算対象の関係の組の数を大幅に減らす。
そのため最適化においては、制限演算を問い合わせ木構造の葉の方向へ移動することで、部分関係代数式により生成される関係群の大きさを小さくすることができるであろう。

#### 制限演算の基本的な法則

1. $\sigma _{A}(R)=\sigma _{A}\sigma _{A}(R)$
2. $\sigma _{A}\sigma _{B}(R)=\sigma _{B}\sigma _{A}(R)$

#### 複合した制限演算の分解

先述の2つの法則を、制限演算の連なりを分割/結合するために使うことができる。
いくつかの情況においては、制限演算を結合することは有効である。
なぜなら制限演算子を2回使うのではなく1回で済むからである。
別の情況においては、複合した制限演算を分割することが有効である。
このときは、複合した制限演算を木構造内で移動できない場合に、個々の制限演算に分割することで、移動できるようになる。

1. $\sigma _{A\land B}(R)=\sigma _{A}(\sigma _{B}(R))=\sigma _{B}(\sigma _{A}(R))$
2. $\sigma _{A\lor B}(R)=\sigma _{A}(R)\cup \sigma _{B}(R)$

#### 制限と直積

直積は評価に最もコストを要する演算である。
入力の関係の濃度 (組の数) が $N$ と $M$ であった場合、直積演算の結果として返される関係の濃度は $NM$ となる。
そのため直積演算を行う前に、演算対象の2つの関係の濃度をできるだけ小さくするよう、最善を尽くすことが重要である。

直積演算の後に制限演算を行う場合、例えば σ$A$($R$ × $P$) を評価する場合、この最適化は効果的に行うことができる。
結合の定義を考えると、最適化をとりわけ効果的に行うことができる。
もし制限演算の後に直積演算が続くのであれば、他の制限の法則を使うことで、制限演算を問い合わせの木構造の高い位置から葉の方向へ押し下げるよう試みることができる。

この場合制限条件式 $A$ を、複合した制限演算を分割する法則群を使うことで、制限条件式 $B$、$C$、$D$ へと分解する。
すなわち $A$ = $B$ ∧ $C$ ∧ $D$ となる。
そして $B$ は関係 $R$ の属性のみから構成され、$C$ は関係 $P$ の属性のみから構成され、$D$ は  $R$ と $P$ の両方の属性から構成されるようにする。
$B$、$C$、$D$ のいずれかが欠如している場合もある。
以上の変換は次のように示される。

- σ$A$($R$ × $P$) = σ$B$ ∧ $C$ ∧ $D$($R$ × $P$) = σ$D$(σ$B$($R$) × σ$C$($P$))

#### 制限と集合演算

次の3つの法則は、問い合わせの木構造において制限演算を集合演算 (差・和・交わり) よりも葉に近い方向に押し下げる。

注意: 差演算もしくは交わり演算の場合は、木構造を変換することで、制限演算を演算対象の関係群のうちただ一つの関係に対して適用することが可能である。
この適用による最適化が有効なのは、演算対象の関係群のうち一つが小さく、小さな関係を演算対象として使うことによる利益に対して、制限演算を行うことに伴うオーバーヘッドが大きい場合である。

1. $\sigma _{A}(R\setminus P)=\sigma _{A}(R)\setminus \sigma _{A}(P)=\sigma _{A}(R)\setminus P$
2. $\sigma _{A}(R\cup P)=\sigma _{A}(R)\cup \sigma _{A}(P)$
3. $\sigma _{A}(R\cap P)=\sigma _{A}(R)\cap \sigma _{A}(P)=\sigma _{A}(R)\cap P=R\cap \sigma _{A}(P)$