Оставляя SQL на мгновение ...
Реляционный оператор принимает одно или несколько отношений в качестве параметров и приводит к отношению. Поскольку отношение не имеет атрибутов с повторяющимися именами по определению, реляционные операции тета-соединение и естественное соединение «удаляют дубликаты атрибутов». [Большая проблема с размещением примеров в 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" не совсем корректно.
Точно так же, Учебное пособие D не включает тета-оператора соединения. Это в основном потому, что другие операторы (например, естественное соединение и ограничение) делают его ненужным и не очень полезным. Напротив, примитивные операторы Кодда включали продукт и ограничение, которые можно использовать для выполнения тэта-соединения.
В 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 строками, т. Е. This
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);
** То есть, хотя существует только одна реляционная модель (т. Е. Кодда), может быть более одной реляционной алгебры (т. Е. Кодда только одна).