MySQL - 没有 ON 子句的 JOIN vs CROSS JOIN vs SELECT t1.* t2.* FROM t1, t2;

问题描述

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

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

加入(没有“ON”子句)

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,(3,(NULL,"t1")
;

CREATE TABLE t2(id integer,t CHAR(2));
INSERT INTO t2(id,t) 
VALUES
  (2,"t2"),(4,"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   |
+------+------+------+------+

解决方法

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

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

...

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...