回答:
シータが参加します(例えば≥など)の任意の比較関係を可能にします。
等結合は、等値演算子を使用したシータです。
自然が参加します、各関係で同じ名前を持つ属性の等価結合です。
さらに、自然結合により、等価比較に含まれる重複列が削除されるため、比較される各列は1つだけ残ります。大まかな関係代数的用語で:
⋈ = πR,S-as ○ ⋈aR=aS
theta
シータ結合は、結合の基準として使用される任意の条件を指します。(データベースシステム:Garcia-Molina、Ullman、Widom、第2章、Theta Joinによる完全な本を参照)
正確な違いを説明する答えは結構ですが、リレーショナル代数がどのように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「データベース入門」を完了したので、あえて新鮮なリレーショナル代数があると思います。
CROSS JOIN
SQL の操作はテーブル式(列の行)になります。集合演算デカルト積は、ペアのセットになります。
SELECT * FROM...
ます(おそらくあなたはそうします)。しかし、それは言語にあり、それはすべてのSQL実装にあり、私はそれを頻繁に使用します(そして私はあなたもそうします!)
@outisの答えは良いです。関係に関しては簡潔で正しいです。
ただし、状況はSQLに関しては少し複雑です。
通常のサプライヤーと部品データベースを検討しますが、SQLで実装されています。
SELECT * FROM S NATURAL JOIN SP;
列を持つ結果セット**を返します
SNO, SNAME, STATUS, CITY, PNO, QTY
結合は、両方のテーブルで同じ名前の列で実行されますSNO
。結果セットには6つの列があり、には1つの列しか含まれていないことに注意してくださいSNO
。
次に、結合の列名を明示的に指定する必要があるシータeqijoinを検討します(さらに、範囲変数S
とSP
必須です)。
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(...)
。
SELECT * FROM table_expression;
ですか」?
Naturalは、ThetaのサブセットであるEquiのサブセットです。
シータ結合で=記号を使用すると、自然結合を使用する場合とまったく同じになりますか?
必ずしもそうとは限りませんが、それはEquiです。Naturalは、同様に名前が付けられたすべての列で一致していることを意味します。Equiは、「=」のみを使用していることを意味します(「未満」などではありません)。
ただし、これは純粋な学界です。リレーショナルデータベースを何年も使用していて、これらの用語が使用されるのを聞くことはできません。
シータ結合:
演算子(=、<、>、> =など)を使用して結合のクエリを作成すると、その結合クエリはシータ結合の下に置かれます。
等価結合:
等価演算子のみを使用して結合のクエリを作成すると、その結合クエリは等価結合に分類されます。
例:
> 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 | 部署名| | | | |
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(=)演算子を使用する場合、それは「等結合」と呼ばれます。