シータ結合、等結合、自然結合に関しては、関係代数を理解するのに苦労しています。誰かが私がそれをよりよく理解するのを手伝ってくれませんか?シータ結合で=記号を使用する場合、自然結合を使用するのとまったく同じですか?
7 に答える
シータ結合により、任意の比較関係(≥など)が可能になります。
等結合は、等式演算子を使用したシータ結合です。
自然結合は、各関係で同じ名前を持つ属性の等結合です。
さらに、自然結合により、等式比較に関係する重複列が削除されるため、比較された各列のうち1つだけが残ります。大まかな関係代数の用語で:
⋈ = πR,S-as ○ ⋈<sub>aR=aS
正確な違いを説明する答えは問題ありませんが、リレーショナル代数が SQL に変換される方法と、3 つの概念の実際の価値を示したいと思います。
あなたの質問の重要な概念は、結合のアイデアです。結合を理解するには、デカルト積を理解する必要があります (この例は、onedaywhen が指摘するようにクロス結合と呼ばれる SQL に基づいています)。
これは実際にはあまり役に立ちません。この例を考えてみましょう。
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 は次のようになります - bellow または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 は、これらの製品により多くの価値を付加するためにここにあります。各コンポーネントは製品に属しているため、本当に必要なのは、製品を関連するコンポーネントと「結合」することです。これを行う方法は、結合を使用することです。
Product JOIN Component ON Pname
関連する 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 のバリエーションです。
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" を修了したので、リレー代数を念頭に置いていると思います。
@outisの答えは良いです:関係に関しては簡潔で正しいです。
ただし、SQL に関しては状況が少し複雑です。
SQL で実装されている通常のサプライヤと部品のデータベースを考えてみましょう。
SELECT * FROM S NATURAL JOIN SP;
列を含む結果セット**を返します
SNO, SNAME, STATUS, CITY, PNO, QTY
結合は、両方のテーブルの同じ名前の列で実行されますSNO
。結果セットには 6 つの列があり、 の列は 1 つしか含まれていないことに注意してくださいSNO
。
次に、結合の列名を明示的に指定する必要がある theta 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 テーブル式ではありません。私はそれを結果セットと呼んでいます。
Naturalは、ThetaのサブセットであるEquiのサブセットです。
シータ結合で=記号を使用する場合、自然結合を使用するのとまったく同じですか?
必ずしもそうとは限りませんが、それはEquiになります。Naturalは、同じ名前のすべての列で一致していることを意味します。Equiは、「=」を排他的に使用していることを意味します(「未満」などではありません)。
これは純粋な学界ですが、リレーショナルデータベースを何年も使用しても、誰もこれらの用語を使用するのを聞くことはできません。