【问题标题】:What is a 'Cartesian' in the context of MySQL?MySQL 上下文中的“笛卡尔”是什么?
【发布时间】:2014-08-06 23:00:05
【问题描述】:

我试图更好地理解什么是“笛卡尔”。以下是从xQberta question I asked earlier 的回答中引用的一段话:

在使用左(或外)连接时,您必须考虑何时 数据限制是在创建笛卡尔时施加的。

“笛卡尔”xQbert 指的是与“笛卡尔积”相同的东西,当我忘记指定加入表格的标准时,我非常害怕?

【问题讨论】:

标签: mysql sql


【解决方案1】:

首先,不要让加入吓到你,尊重他们。

Select
      a.field1,
      ...
      x.field2
   from
      SomeTable a
         JOIN AnotherTable x
            on a.SomeKey = x.SomeKey
   where
      blah...

维基百科涉及各种假设场景和数学参考等。我将尝试使用更简单的术语。在进行连接时,只需知道相关表之间的“关键”元素是什么。在大多数情况下,它将通过一些常见的 Key ID(customerID、orderID、itemID 等)来实现。

所以,从最简单的意义上说,如果您有一个订单和客户系统并执行类似的操作

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

当进入左连接(或右连接)时,前提仍然成立。始终应用 KNOWN 键关系。如果它们匹配,则很好(内连接),如果不匹配(左连接),则即使右侧没有匹配,查询左侧表中的记录仍将被包含在内。我最近看到了一个加入说明的例子,我也会尝试找到它。

现在有了这个基本解释,考虑在您的系统中有 3 个表......每个表分别有 5000、2000 和 3000 条记录。如果您在不使用各个表之间的连接条件的情况下进行查询,您最终会得到 30,000,000,000 条记录,而且显然是一团糟。

所以,在编写查询时,我总是尝试以这种方式开始。查看我需要从表 A 中的部分一直到表 D 中的某些内容的所有表。我需要查看每个表之间的关系在您的查询中始终包含它们(前提是您需要所有表)。一旦你得到表和你想要的所有列,然后考虑你想要的 CRITERIA。这些可以应用于 where 子句(通常用于第一个表),但也可以在查询中包含其他别名。但是,这可能有点棘手,尤其是在处理左连接时。如果您有适用于其中一个联接表的某些条件,则可以在该级别添加逻辑“AND”条件。

此外,在进行查询时,请养成为长名称的表使用别名以简化查询可读性的习惯。此外,始终在具有多个表的查询中限定 table.column 或 alias.column。如果人们试图帮助您,但他们不知道表中的列是什么,那么就更难理解了……更不用说在您接管或更新查询后有人了。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    相关资源
    最近更新 更多