我试图更好地理解什么是“笛卡尔”。以下是从xQberta 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/

10-11 05:21