将SQL搁置一会儿…
关系运算符将一个或多个关系作为参数并生成一个关系。因为根据定义,关系中没有具有重复名称的属性,所以关系 *** 作theta联接和自然联接都将“除去重复的属性”。[按照您的要求在SQL中发布示例以解释关系 *** 作的一个大问题是,SQL查询的结果不是关系,因为除其他缺点外,它可能具有重复的行和/或列。]
关系笛卡尔积运算(一个关系的结果)与设置的笛卡尔积(一对结果的结果)不同。“笛卡尔”一词在这里并不是特别有用。实际上,科德称他的原始运算符为“产品”。
真正的关系语言Tutorial
D在Tutorial
D的合著者Hugh Darwen
**提出的关系代数中缺少乘积运算符,而product不是原始运算符。这是因为没有属性名称的两个关系的自然连接在相同的关系中产生的结果与相同的两个关系的乘积相同,即自然连接更普遍,因此更有用。
考虑以下示例(教程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不包含theta联接运算符。这本质上是因为其他运算符(例如自然连接和限制)使它既不必要又不是非常有用。相比之下,Codd的原始运算符包括可用于执行theta联接的乘积和限制。
SQL有一个显式的乘积运算符
CROSSJOIN,即使通过创建重复的列(属性)违反了1NF的条件,也可以将结果强制为乘积。考虑与上面的后者Tutormap 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;
这将返回一个表表达式,该表表达式包含两列(而不是一个属性),分别称为
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);
**也就是说,尽管只有一种关系模型(即Codd的),但是可以有多个关系代数(即Codd只是一个)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)