Ответ 1
Оставляя SQL в стороне на мгновение...
Оператор отношения принимает одно или несколько отношений как параметры и приводит к соотношению. Поскольку отношение не имеет атрибутов с двойными именами по определению, реляционные операции theta join и естественное объединение будут "удалять дубликаты атрибутов". [Большая проблема с примерами проводок в SQL для объяснения операций отношения, как вы просили, заключается в том, что результат SQL-запроса не является отношением, потому что среди других грехов он может иметь повторяющиеся строки и/или столбцы.]
Реляционная декартово произведение (результат в отношении) отличается от множества декартова произведения (приводит к набору пар). Слово "картезианство" здесь не особенно полезно. Фактически, Кодд назвал свой примитивный оператор "продуктом".
По-настоящему реляционный язык В учебнике D отсутствует оператор продукта, а продукт не является примитивным оператором в реляционной алгебре, предложенным соавтором учебника D, Хью Дарвен **. Это связано с тем, что естественное объединение двух отношений без общих имен атрибутов приводит к тому же соотношению, что и произведение тех же двух отношений, то есть естественное объединение является более общим и, следовательно, более полезным.
Рассмотрим эти примеры (учебник 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
возвращает произведение отношений, то есть степень двух (т.е. двух атрибутов, 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
возвращает естественное объединение отношений, то есть степень одного (т.е. объединение множества атрибутов, дающих один атрибут Y
), и мощность 2 (т.е. дублированные кортежи удалены).
Надеюсь, что приведенные выше примеры объясняют, почему ваше утверждение "что набор из 13 X набор из 4 = 52" не является строго правильным.
Аналогично, Tutorial D не включает оператор объединения theta. Это связано с тем, что другие операторы (например, естественное объединение и ограничение) делают его ненужным и не очень полезным. Напротив, примитивные операторы Codd включали продукт и ограничение, которое можно использовать для выполнения тета-соединения.
SQL имеет явный оператор продукта с именем CROSS JOIN
, который заставляет результат быть продуктом, даже если он влечет за собой нарушение 1NF путем создания повторяющихся столбцов (атрибутов). Рассмотрим SQL-эквивалент последнего примера Tutoral D выше:
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;
Это возвращает выражение таблицы с двумя столбцами (а не с одним атрибутом), которые называются 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);
** То есть, хотя существует только одна реляционная модель (т.е. Кодд), может быть более одной реляционной алгебры (т.е. Кодд является одной).