シータ結合、等結合、自然結合の違い


92

シータ結合、等結合、自然結合について関係代数を理解するのに苦労しています。誰かが私がそれをよりよく理解するのを助けてくれませんか?シータ結合で=記号を使用すると、自然結合を使用する場合とまったく同じになりますか?


バウンティからの問題の引用について...彼はそこでコッドを引用していない、彼は彼のコメントが下に表示される私の答えから引用している。
ハイゼンベルグ2013

回答:


138

シータが参加します(例えば≥など)の任意の比較関係を可能にします。

結合は、等値演算子を使用したシータです。

自然が参加します、各関係で同じ名前を持つ属性の等価結合です。

さらに、自然結合により、等価比較に含まれる重複列が削除されるため、比較される各列は1つだけ残ります。大まかな関係代数的用語で: ⋈ = πR,S-as ○ ⋈aR=aS


13
自然結合は同じ名前の列を削除します
Bogdan Gavril MSFT 2013年

2
それらすべて、または1つを除くすべて?
Christopher Shroba 2014年

Equijoinは、両方のテーブルで同じ名前の等式列も削除します。
Vishal R

1
@outis、「theta join」の「theta」はどういう意味ですか?
Pacerier、2015

2
@Pacerier:歴史的に、thetaシータ結合は、結合の基準として使用される任意の条件を指します。(データベースシステム:Garcia-Molina、Ullman、Widom、第2章、Theta Joinによる完全な本を参照)
Ram Rajamony 2017

55

正確な違いを説明する答えは結構ですが、リレーショナル代数がどのようにSQLに変換されるか、および3つの概念の実際の値は何かを示したいと思います。

質問の重要な概念は、結合のアイデアです。結合を理解するには、デカルト積を理解する必要があります(例はSQLに基づいており、同等の機能はonedayが指摘するようにクロス結合と呼ばれます)。

これは実際にはあまり役に立ちません。この例を考えてみましょう。

Product(PName, Price)
====================
Laptop,   1500
Car,      20000
Airplane, 3000000


Component(PName, CName, Cost)
=============================
Laptop, CPU,    500
Laptop, hdd,    300
Laptop, case,   700
Car,    wheels, 1000

デカルト積のProduct x Componentは次のとおりです。12行= 3 x 4であることがわかります。明らかに、「ラップトップ」のような「ホイール」付きの行には意味がないため、実際にはデカルト積はほとんど使用されません。

|    PNAME |   PRICE |  CNAME | COST |
--------------------------------------
|   Laptop |    1500 |    CPU |  500 |
|   Laptop |    1500 |    hdd |  300 |
|   Laptop |    1500 |   case |  700 |
|   Laptop |    1500 | wheels | 1000 |
|      Car |   20000 |    CPU |  500 |
|      Car |   20000 |    hdd |  300 |
|      Car |   20000 |   case |  700 |
|      Car |   20000 | wheels | 1000 |
| Airplane | 3000000 |    CPU |  500 |
| Airplane | 3000000 |    hdd |  300 |
| Airplane | 3000000 |   case |  700 |
| Airplane | 3000000 | wheels | 1000 |

JOINは、これらの製品にさらなる価値を追加するためにここにあります。各コンポーネントは製品に属しているため、私たちが本当に望んでいるのは、製品とそれに関連するコンポーネントを「結合」することです。これを行う方法は、結合を使用することです。

PJ名の製品結合コンポーネント

関連するSQLクエリは次のようになります(ここですべての例を試すことができます

SELECT *
FROM Product
JOIN Component
  ON Product.Pname = Component.Pname

そして結果:

|  PNAME | PRICE |  CNAME | COST |
----------------------------------
| Laptop |  1500 |    CPU |  500 |
| Laptop |  1500 |    hdd |  300 |
| Laptop |  1500 |   case |  700 |
|    Car | 20000 | wheels | 1000 |

ラップトップには3つのコンポーネントがあり、車には1つ、飛行機にはないので、結果には4行しかありません。これははるかに便利です。

質問に戻ると、質問するすべての結合は、先ほど示したJOINのバリエーションです。

自然結合 =結合(ON句)は、同じ名前のすべての列に対して行われます。他のすべての結合とは異なり、結果から重複する列を削除します。ほとんどのDBMS(MicrosoftのSQL Server、OracleのMySQLなどのさまざまなベンダーによって作成されたデータベースシステム)は、これをサポートすることすらしません。開発者が来て、製品の2番目の列の名前をPriceからCostに変更したとします。次に、すべての自然結合はPNameとCostで行われ、一致する数値がないため0行になります。

シータ結合 =これは条件(SQLのON句)を指定できるため、誰もが使用する一般的な結合です。たとえば、最初の2文字が似ている製品や価格が異なる製品など、お好きな条件で参加できます。実際には、これはまれなケースです。95%のケースでは、平等条件で参加します。

Equi Join =実際に使用される最も一般的なもの。上記の例は、等価結合です。データベースはこのタイプの結合に最適化されています!等価結合の反対側は非等価結合です。つまり、「=」以外の条件で結合した場合です。データベースはこのために最適化されていません!どちらも一般的なtheta結合のサブセットです。自然結合もシータ結合ですが、条件(シータ)は暗黙的です。

情報源:大学+認定SQL Server開発者+最近スタンフォード大学からMOO「データベース入門」を完了したので、あえて新鮮なリレーショナル代数があると思います。


1
「デカルト積」という用語をやや大まかに使用します。関係演算子の結果は関係になります(すべての関係演算子と共通です!)CROSS JOINSQL の操作はテーブル式(列の行)になります。集合演算デカルト積は、ペアのセットになります。
2013年

1
「データベース」とは、実際には「DBMS」を意味します。これは、「概念」に取り組む際の重要な違いです。
2013年

2
onedaywhen-役立つコメントをすべてありがとう!コードレビューのように感じます:)。デカルト積とDBMSの問題を修正しました。私は、自然結合は学術的な関心のみであり、SQL Serverなどの重要なDBMSはこれを意図的に実装していないと私は考えています。条件を追加すると、コードの理解と保守が向上します。関連する質問:stackoverflow.com/questions/4826613/natural-join-in-sql-server
Bogdan Gavril MSFT 2013年

1
@HLGEM:に対して同様の議論をすることができSELECT * FROM...ます(おそらくあなたはそうします)。しかし、それは言語にあり、それはすべてのSQL実装にあり、私はそれを頻繁に使用します(そして私はあなたもそうします!)
2013年

1
「自然な」結合された列の実際の問題は、名前を変更することではなく、システム内の結合された可能性のあるすべてのテーブル間で競合してはならない新しい名前を追加することです。「名前」、「説明」などの非常に一般的な列を使用してください。「自然結合」を使用すると、それらが結合されますが、それは意味をなさず、ビジネスロジックに反し、エラーにつながります。つまり、「自然な結合」は危険です。(プライマリ/フォーリン)キー列を除いて明確な名前を持たせ、「名前の間隔」を失うことを強制します。
LoganMzz

14

@outisの答えは良いです。関係に関しては簡潔で正しいです。

ただし、状況はSQLに関しては少し複雑です。

通常のサプライヤーと部品データベースを検討しますが、SQLで実装されています。

SELECT * FROM S NATURAL JOIN SP;

列を持つ結果セット**を返します

SNO, SNAME, STATUS, CITY, PNO, QTY

結合は、両方のテーブルで同じ名前の列で実行されますSNO。結果セットには6つの列があり、には1つの列しか含まれていないことに注意してくださいSNO

次に、結合の列名を明示的に指定する必要があるシータeqijoinを検討します(さらに、範囲変数SSP必須です)。

SELECT * FROM S JOIN SP ON S.SNO = SP.SNO;

結果セットには、の2つの列を含む7つの列がありSNOます。結果セットの名前は、SQL標準が「実装依存」と呼ぶものですが、次のようになります。

SNO, SNAME, STATUS, CITY, SNO, PNO, QTY

または多分これ

S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY

言い換えるとNATURAL JOIN、SQLでは、重複する名前を持つ列を結果セットから削除すると見なすことができます(ただし、残念ながら、重複する行は削除されません。自分自身に変更SELECTすることを忘れないでSELECT DISTINCTください)。


**結果がどうなるかよくわかりませんSELECT * FROM table_expression;。他の理由で、重複した名前の列や名前のない列が存在する可能性があるため、これはリレーションではありません。他の理由で列の順序が重要であるため、それがセットではないことを知っています。SQLテーブルでもSQLテーブル式でもありません。これを結果セットと呼びます。


同じことが当てはまりますJOIN ... USING(...)
Benoit

なぜあなたは言う、「私はかなりの結果がわからないSELECT * FROM table_expression;ですか」
Pacerier、2015

@Pacerier:えーと、何なのかわからないから!前回見たとき、SQL標準はそれが何であるかを定義することを避けていました。私はそれが何でないかを知っています(リレーション、セット、テーブル、テーブル式ではありません)。参照しやすいように、私は独自の「結果セット」という用語を使用しました。関係モデルでは、2つの関係を含む操作の結果は関係であることに注意してください。SQL AFAIKに対して同等のステートメントを作成することはできません。
2015

11

Naturalは、ThetaのサブセットであるEquiのサブセットです。

シータ結合で=記号を使用すると、自然結合を使用する場合とまったく同じになりますか?

必ずしもそうとは限りませんが、それはEquiです。Naturalは、同様に名前が付けられたすべての列で一致していることを意味します。Equiは、「=」のみを使用していることを意味します(「未満」などではありません)。

ただし、これは純粋な学界です。リレーショナルデータベースを何年も使用していて、これらの用語が使用されるのを聞くことはできません。


「リレーショナルデータベース」と言ったとき、「SQL」など、別の意味だと思います。
onedaywhen

SQL以外のリレーショナルデータベースを使用して、学界ではない作業を行いますか?それでは、どの製品を意味しますか?
onedaywhen

3
Coddの元の代数では、自然結合が結合の基本的なタイプですが、等結合またはシータ結合は、NJ(たとえば、外積)の省略形で、その後に制限が続きます。「NaturalはシータのサブセットであるEquiのサブセットです」おそらくそれが意味することは、すべてのNJはEJまたはTJとしても表現できるということです。σ1 = 1(A x B)が等結合として数えられる場合、それは真実であると思います。その場合、関係代数のすべての演算は、その形式の等結合として表すことができます。ここでのあいまいさは、RAに可能な基本オペレーターのセットが複数存在することです。
nvogel 2012

2
@EricFail:sqlvogelは、コッドからではなく、ケケケラの答えを引用しています。Coddの結合に関する記述(θなど)についてさらに知りたい場合は、「データベース管理のリレーショナルモデル」を試すか、彼の参考文献を調べてみてください。
outis

1
...リンクする質問には、探しているものに近い、おそらく可能な限り近い答えが含まれています。これは、データベースのサブ言語のリレーショナル完全性にリンクしています。P. 10は、θ、=と自然結合の間の関係を説明しています(ただし、自然はCoddの公式では=の厳密なサブセットではなく、=-結合の射影です)。
outis 2013年

7

シータ結合: 演算子(=、<、>、> =など)を使用して結合のクエリを作成すると、その結合クエリはシータ結合の下に置かれます。

等価結合: 等価演算子のみを使用して結合のクエリを作成すると、その結合クエリは等価結合に分類されます。

例:

> SELECT * FROM Emp JOIN Dept ON Emp.DeptID = Dept.DeptID;
> SELECT * FROM Emp INNER JOIN Dept USING(DeptID)
これは表示されます:
 _________________________________________________
| Emp.Name | Emp.DeptID | 部署名| Dept.DeptID |
| | | | |

注:Equi結合もシータ結合です!

自然結合: 両方のテーブルのすべての同じ名前の列を比較することによって暗黙的に発生する、等価結合の一種。

注:ここでは、結合結果には、同じ名前の列のペアごとに1つの列しかありません。

 SELECT * FROM EMP NATURAL JOIN Dept
これは表示されます:
 _______________________________
| DeptID | Emp.Name | 部署名|
| | | |

1

2つのテーブルのデカルト積は、数学の例のようなタプルのすべての可能な組み合わせに2つのセットの外積を与えます。多くの場合、メモリ内の不要なスペースを占めるいくつかのジャンク値もあるので、ここでの結合は、必要で意味のある属性値のみの組み合わせを提供する救助になります。

内部結合はテーブル内の繰り返しフィールドを2回提供しますが、ここでの自然結合は繰り返し列をフィルタリングして1回だけ表示することで問題を解決します。自然結合はメモリを保持するため、より効率的です。また、自然結合では冗長性が削除されます。

2つのテーブルの等価結合では、他のテーブルの値と一致するタプルのみが表示されます。たとえば、new1とnew2を2つのテーブルとします。SQLクエリselect * from new1 join new2 on new1.id = new.id(idは2つのテーブルの同じ列)の場合、new2テーブルから開始し、2番目のテーブルのIDと一致する結合します。また、非等結合には、<、>、およびbetween演算子のように等価演算子はありません。

theta結合は、等値およびその他の<、>比較演算子を含むすべての比較演算子で構成されます。equality(=)演算子を使用する場合、それは「等結合」と呼ばれます。


0

自然結合:2つの関係に少なくとも1つの共通属性がある場合、自然結合が可能になります。

シータ結合:シータ結合は、2つが特定の条件で動作する場合に可能です。

Equi Join:2人が公平な条件で行動する場合、Equiは可能です。シータジョインの一種です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.