使用自联接的SQL Cartesian Join / Cross Join没有Where子句/谓词

时间:2015-07-26 20:38:27

标签: mysql join

我有一张简单的表格:

Cartesian
+--------+
| letter |
+--------+
| A      |
| B      |
| C      |
+--------+

自我加入查询1:

SELECT t1.letter, t2.letter
FROM cartesian t1, cartesian t2;

结果:

+--------+--------+
| letter | letter |
+--------+--------+
| A      | A      |
| B      | A      |
| C      | A      |
| A      | B      |
| B      | B      |
| C      | B      |
| A      | C      |
| B      | C      |
| C      | C      |
+--------+--------+

自我加入查询2:

SELECT t1.letter, t2.letter
FROM cartesian t2, cartesian t1;

结果:

+--------+--------+
| letter | letter |
+--------+--------+
| A      | A      |
| A      | B      |
| A      | C      |
| B      | A      |
| B      | B      |
| B      | C      |
| C      | A      |
| C      | B      |
| C      | C      |
+--------+--------+

为什么结果不同?我选择相同的列和相同的表。唯一不同的是FROM子句中表的排序。

4 个答案:

答案 0 :(得分:1)

但是如果你忽略这个顺序,那两个结果就没有什么不同了 - 这两组包含完全相同的元组对,因此完全相同。

不保证以任何方式订购任何返回但未使用order by子句显式排序的结果。订单看起来不是随机的这一事实是由于数据库的查询处理组件的内部工作原因而不是可以或应该依赖的东西。

如果你想订购,你必须说出来。

答案 1 :(得分:0)

结果没有什么不同。两种结果都存在相同的数据。

没有order by子句它自己做,并且因为什么原因决定t2将按字母顺序排序,其中t1不会在两种情况下。

答案 2 :(得分:0)

结果相同,订单不同。

实际上简单的事情是只要输出顺序没有顺序每次都可以不同,即使使用group by以确保你得到你想要的顺序订单。这是供应商特定的实现,与sql语言无关。 (即使大多数数据库实现通过嵌入在组中的顺序来提供订单。)

答案 3 :(得分:0)

除非您明确使用

命令,否则无法保证订购