当我做这样的查询时,做笛卡尔积(交叉连接)背后的想法是什么 -
SELECT * FROM agents, orders
Run Code Online (Sandbox Code Playgroud)
我认为它们会连接(如pandas)。添加表格而不是乘以表格感觉更自然。
只是好奇,并没有在互联网上找到默认笛卡尔积背后的基本原理。我假设FROM table1, table2
根据 SQL 的语法对于交叉连接可能更正确,但为什么呢?
Bil*_*win 10
逗号样式连接 (SQL-89) 与使用JOIN
关键字 (SQL-92)的语法不是重点。您应该使用更现代的语法,但它没有解决如果您不指定条件为什么默认会是笛卡尔积的问题。
答案是它使关系代数起作用。
笛卡尔积是两个集合的元素的所有组合的集合。第一组的每个元素都与第二组的每个元素配对。
关系是笛卡尔积的子集。这是一个笛卡尔积,加上一个条件,用于测试任何给定的元素对是否属于该关系。
但是默认条件是固定true
值,所以每次配对都通过测试。所以默认关系最终是笛卡尔积。
我想另一种方法是使默认条件成为固定false
值,因此默认关系将是空关系。
这会使某些情况变得更容易,例如,如果您运行 aDELETE
但不小心忘记了该WHERE
子句,则可以避免删除整个表。
但是随后我们会从不同的人那里得到有关 Stack Overflow 的问题,他们问为什么默认连接是空集,因为当他们忘记查询的WHERE
子句SELECT
并且看起来他们的数据库是空的时,这会让他们心跳加速。
我不熟悉concatenate在Pandas 中的工作方式,但我认为这CROSS JOIN
是唯一有意义的子句,在这种情况下没有其他任何规定。
您当然不能垂直连接(UNION
在 SQL 中)表,因为它们的列可能有所不同(按列数及其数据类型)以及如何水平连接它们,即在什么条件下您可以将每个表中的行对齐到当未指定任何内容时,将它们关联为一行?我认为在关系逻辑的上下文中最简单的答案是CROSS JOIN
.
此外,Pandas 中的concatenate似乎旨在对与关系数据库不同类型的对象进行操作。虽然从技术上讲,这些对象可以被视为一组值,但描述它们的标准以及这些值所依据的约束与具有观察不同数据类型的列的记录关系表不同,并且可能受数据库约束的约束, 等等。
为了实现SQL类似的结果看什么样的单,串连运作熊猫呢,你就需要应用的一系列操作可能包括PIVOT
,UNION
和CAST
,例如。