web-dev-qa-db-ja.com

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

シータ結合、等結合、自然結合に関しては、関係代数を理解するのが困難です。誰かがそれをよりよく理解するのを手伝ってくれませんか?シータ結合で=記号を使用する場合、自然結合を使用するのとまったく同じですか?

89
maclunian

シータ結合は、任意の比較関係(≥など)を許可します。

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

自然結合は、各リレーションシップで同じ名前を持つ属性の等価結合です。

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

131
outis

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

質問の重要な概念は、結合のアイデアです。結合を理解するには、デカルト積を理解する必要があります(この例はSQLに基づいており、同等のものはonedaywhenが指摘する相互結合と呼ばれます)。

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

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は、-以下または sql fiddle になります。 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は、これらの製品にさらなる価値を加えるためにここにいます。各コンポーネントは製品に属しているため、実際に必要なのは、製品をその関連コンポーネントと「結合」することです。これを行う方法は、結合を使用することです。

Pnameの製品JOINコンポーネント

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

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のバリエーションです:

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

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

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

情報源:大学+認定SQL Server開発者+最近スタンフォード大学のMOO "Introduction to databases"を完成したので、関係代数は新鮮だと思います。

49

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

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

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

SELECT * FROM S NATURAL JOIN SP;

列を含む結果セット**を返します

SNO, SNAME, STATUS, CITY, PNO, QTY

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

次に、結合の列名を明示的に指定する必要があるシータeqijoinを考えます(範囲変数SおよびSPが必要です)。

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

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

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

またはおそらくこれ

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

つまり、SQLのNATURAL JOINは、結果セットから重複した名前の列を削除すると見なすことができます(ただし、悲しいことに重複行は削除されません。SELECTSELECT DISTINCTに変更する必要があります) 。


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

14
onedaywhen

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

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

必ずしもではありませんが、それはEquiです。 Naturalは、同じ名前のすべての列で一致することを意味します。Equiは、「=」のみを使用することを意味します(「より小さい」などではありません)。

ただし、これは純粋なアカデミアです。リレーショナルデータベースを長年使用しても、誰もこれらの用語を使用することを聞くことはありません。

9
heisenberg

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

等結合:等値演算子のみを使用して結合のクエリを作成すると、その結合クエリは等結合になります。

例:

> SELECT * FROM Emp JOIN Dept ON Emp.DeptID = Dept.DeptID; 
> SELECT * FROM Emp INNER JOIN Dept USING(DeptID)
次のように表示されます。
 _________________________________________________ 
 | Emp.Name | Emp.DeptID |部門名| Dept.DeptID | 
 | | | | | 

注:等結合はシータ結合でもあります!

Natural Join:両方のテーブルのすべての同じ名前の列を比較することで暗黙的に発生するEqui Joinのタイプ。

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

 SELECT * FROM Emp NATURAL JOIN Dept Dept
次のように表示されます:
 _______________________________ 
 | DeptID | Emp.Name |部門名| 
 | | | | 
5
Palak Jain

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

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

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

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

1
himani

自然結合:2つのリレーションに少なくとも1つの共通属性がある場合、自然結合が可能になります。

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

エクイ結合:2つのエクイティ条件が成立するとエクイが可能になります。シータ結合の一種です。

0
rashedcs