【问题标题】:MySQL - JOIN without ON clause vs CROSS JOIN vs SELECT t1.* t2.* FROM t1, t2;MySQL - 不带 ON 子句的 JOIN vs CROSS JOIN vs SELECT t1.* t2.* FROM t1, t2;
【发布时间】:2021-09-20 10:08:36
【问题描述】:

我的问题是。是否存在以下三个查询会产生不同输出的情况?他们是否总是返回相同的数据集,或者他们是否有任何例外。他们在性能上有什么不同吗?

似乎在所有情况下,一张表的行都乘以另一张表的行。

加入(没有“开”子句)

SELECT * FROM 
t1 JOIN t2;

交叉连接

SELECT * FROM t1 
CROSS JOIN t2;

从两个表中选择

SELECT a.*, b.*
FROM t1 a, t2 b;

示例数据:

CREATE TABLE t1(id integer, t CHAR(2));
INSERT INTO t1(id, t) 
VALUES
  (1, "t1"),
  (2, "t1"),
  (3, "t1"),
  (NULL, "t1")
;

CREATE TABLE t2(id integer, t CHAR(2));
INSERT INTO t2(id, t) 
VALUES
  (2, "t2"),
  (3, "t2"),
  (4, "t2"),
  (NULL, "t2")
;

所有查询都会产生相同的输出:

+------+------+------+------+
| id   | t    | id   | t    |
+------+------+------+------+
|    1 | t1   |    2 | t2   |
|    2 | t1   |    2 | t2   |
|    3 | t1   |    2 | t2   |
| NULL | t1   |    2 | t2   |
|    1 | t1   |    3 | t2   |
|    2 | t1   |    3 | t2   |
|    3 | t1   |    3 | t2   |
| NULL | t1   |    3 | t2   |
|    1 | t1   |    4 | t2   |
|    2 | t1   |    4 | t2   |
|    3 | t1   |    4 | t2   |
| NULL | t1   |    4 | t2   |
|    1 | t1   | NULL | t2   |
|    2 | t1   | NULL | t2   |
|    3 | t1   | NULL | t2   |
| NULL | t1   | NULL | t2   |
+------+------+------+------+

【问题讨论】:

    标签: mysql join select cross-join


    【解决方案1】:

    所有三个表达式都是等价的,并且会产生相同的输出。正如join 上的 mysql 手册所说:

    在 MySQL 中,JOIN、CROSS JOIN 和 INNER JOIN 是句法等价物(它们可以相互替换)

    ...

    在没有连接条件的情况下,INNER JOIN 和 ,(逗号)在语义上是等价的:两者都在指定的表之间产生笛卡尔积(即,第一个表中的每一行都与第二个表)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 2010-12-18
      相关资源
      最近更新 更多