【问题标题】:SQL Cartesian Product / Cross Join directionSQL笛卡尔积/交叉连接方向
【发布时间】:2015-10-16 22:16:54
【问题描述】:

我有两个关于这个主题的简单表格:

   abc       numbers
+--------+ +--------+
| letter | | number |
+--------+ +--------+
| a      | |      1 |
| b      | |      2 |
+--------+ |      3 |
           +--------+

查询:

SELECT letter, number
FROM abc
CROSS JOIN numbers;

结果:

+--------+--------+
| letter | number |
+--------+--------+
| a      |      1 |
| b      |      1 |
| a      |      2 |
| b      |      2 |
| a      |      3 |
| b      |      3 |
+--------+--------+

预期结果:

+--------+--------+
| letter | number |
+--------+--------+
| a      |      1 |
| a      |      2 |
| a      |      3 |
| b      |      1 |
| b      |      2 |
| b      |      3 |
+--------+--------+

为什么没有像我预期的那样出来?

根据我在article 中读到的有关笛卡尔积的内容,它应该如我预期的那样出现。

谁能一步步解释我得到的结果是如何被MySql处理的?

【问题讨论】:

  • 看起来像以数字作为外部表的嵌套循环。没有order by,任何订单都无法保证。
  • 因为集合根据定义是无序的,除非明确排序。您的问题的答案可能只能通过检查构成 MySQL 引擎的源代码来找到,特别是查询处理器和相关的优化器。最后,为什么重要?

标签: mysql cartesian-product cross-join


【解决方案1】:

结果集是相同的。 SQL 结果集没有排序,除非您指定order by。两者都包含相同的行,因此它们是相同的。

如果您希望查询以特定顺序返回行并且您不使用order by,那么您的期望完全是错误的。

【讨论】:

  • 稍后我将发布另一个问题,与此有些相关。
猜你喜欢
  • 2014-12-06
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 2015-01-15
  • 2021-05-18
相关资源
最近更新 更多