我试图更好地理解什么是“笛卡尔”。以下是从xQbert
到a question I asked earlier的答案的引文:
使用左(或外)联接时,您必须考虑何时
与创建笛卡尔时的数据限制有关。
当我忘记指定要连接表的条件时,“ Cartesian” xQbert是否与我害怕的“ Cartesian Product”相同?
最佳答案
首先,不要让加入吓到您,请尊重他们。
Select
a.field1,
...
x.field2
from
SomeTable a
JOIN AnotherTable x
on a.SomeKey = x.SomeKey
where
blah...
Wikipedia涉及各种假设情景和数学参考等。我将尝试用更简单的术语来表达。在进行联接时,只需知道所讨论的表之间的“键”元素是什么。在大多数情况下,它将通过一些常见的密钥ID(客户ID,订单ID,商品ID等)来实现。
因此,从最简单的意义上讲,如果您拥有一个订单和客户系统,并且执行
select o.orderID, c.CustomerID
from Orders o, Customers c
没有加入将导致每个订单都将加入每个客户。因此,如果您有5个订单和3个客户,您将获得15个条目。
例如:
Orders | Customers
OrderID CustomerID | CustomerID Name
1 A | A Adam
2 B | B Bill
3 C | C Casey
4 B |
5 C |
你会得到
1-A
1-B
1-C
2-A
2-B
2-C
...
5-A
5-B
5-C
现在,请注意,两个客户每个都有两个订单。由于您知道表之间的公用键,因此您只会获得5个
select o.orderID, c.CustomerID, c.Name
from
Orders o
JOIN Customers c
on o.CustomerID = c.CustomerID
您将得到预期的结果...
1 A Adam
2 B Bill
3 C Casey
4 B Bill
5 C Casey
当进入左联接(或右联接)时,前提仍然成立。始终应用已知的键关系。如果它们匹配,则很好(内部联接),如果不匹配(左联接),则即使左侧不匹配,查询左侧表中的记录仍将包括在内。我最近看到了一个澄清连接的示例,并且也会尝试找到它。
现在有了这个基本的解释,考虑在系统中有3个表...每个表分别具有5000、2000和3000个记录。如果在不查询各个表之间的连接条件的情况下进行查询,则最终将产生30,000,000,000条记录,这显然是一团糟。
因此,在编写查询时,我总是尝试以这种方式开始。查看我需要从表A到表D的所有表。我需要查看每个表之间的关系,始终在查询中使用它们(前提是您需要所有表)。一旦获得了表格以及现在想要的所有列,然后考虑您想要的CRITERIA。这些可以应用于where子句(通常用于第一个表),但也可以在查询中包括其他别名。但是,这可能有些棘手,特别是在处理左联接时。如果您具有某些适用于联接表之一的条件,则可以在该级别上添加逻辑“ AND”条件。
另外,在执行查询时,请养成对长命名的表使用别名的习惯,以简化查询的可读性。另外,在具有多个表的查询中,始终限定table.column或alias.column。如果人们试图帮助您,但他们不知道表中的哪一列,那么将很难进行跟踪……更不用说接管或更新查询后的人了。
祝好运。
关于mysql - 在MySQL上下文中什么是“笛卡尔”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25171664/