SQL はしばらく脇に置いておきます...
関係演算子は、1 つ以上の関係をパラメーターとして取り、結果として関係を生成します。定義上、関係には重複する名前を持つ属性がないため、関係操作シータ結合と自然結合はどちらも「重複する属性を削除」します。[あなたが要求したように、リレーション操作を説明するために SQL で例を投稿することの大きな問題は、SQL クエリの結果がリレーションではないことです。これは、他の罪の中で、行や列が重複する可能性があるためです。]
関係デカルト積演算 (結果が関係になる) は、セットデカルト積 (結果がペアのセットになる) とは異なります。「デカルト」という言葉は、ここでは特に役に立ちません。実際、コッドは原始演算子を「製品」と呼んだ。
真のリレーショナル言語のチュートリアル Dには積演算子がなく、製品はチュートリアル D の共著者であるヒュー ダーウェン** によって提案されたリレーショナル代数の原始演算子ではありません。これは、共通の属性名を持たない 2 つのリレーションの自然結合は、同じ 2 つのリレーションの積と同じリレーションになるためです。つまり、自然結合はより一般的であり、したがってより便利です。
次の例を検討してください (チュートリアル D):
WITH RELATION { TUPLE { Y 1 } , TUPLE { Y 2 } , TUPLE { Y 3 } } AS R1 ,
RELATION { TUPLE { X 1 } , TUPLE { X 2 } } AS R2 :
R1 JOIN R2
リレーションシップの積、つまり次数 2 (つまり、2 つの属性X
とY
) とカーディナリティ 6 (2 x 3 = 6 タプル) の積を返します。
でも、
WITH RELATION { TUPLE { Y 1 } , TUPLE { Y 2 } , TUPLE { Y 3 } } AS R1 ,
RELATION { TUPLE { Y 1 } , TUPLE { Y 2 } } AS R2 :
R1 JOIN R2
リレーションの自然結合、つまり次数 1 (つまり、1 つの属性を生成する属性のセット ユニオンY
) とカーディナリティ 2 (つまり、重複するタプルの削除) を返します。
上記の例が、「13 のセット X 4 のセット = 52」というあなたのステートメントが厳密に正しくない理由を説明してくれることを願っています。
同様に、チュートリアル D には theta 結合演算子が含まれていません。これは基本的に、他の演算子 (自然結合や制限など) が不要であり、あまり役に立たないためです。対照的に、コッドのプリミティブ演算子には、シータ結合を実行するために使用できる積と制限が含まれていました。
SQL には、CROSS JOIN
重複する列 (属性) を作成して 1NF に違反することを伴う場合でも、結果を強制的に積にするという名前の明示的な積演算子があります。上記の後者のチュートリアル D の例に相当する SQL を考えてみましょう。
WITH R1 AS (SELECT * FROM (VALUES (1), (2), (3)) AS T (Y)),
R2 AS (SELECT * FROM (VALUES (1), (2)) AS T (Y))
SELECT *
FROM R1 CROSS JOIN R2;
これは、(1 つの属性ではなく) 2 つの列Y
(!!) と 6 つの行を持つテーブル式を返します。
SELECT c1 AS Y, c2 AS Y
FROM (VALUES (1, 1),
(2, 1),
(3, 1),
(1, 2),
(2, 2),
(3, 2)
) AS T (c1, c2);
** つまり、リレーショナル モデルは 1 つしかありませんが (つまり、Codd のモデル)、複数のリレーショナル代数が存在する可能性があります (つまり、Codd のモデルは 1 つだけです)。