大众t一cross:MySQL-不带ON子句的JOINvsCROSSJOINvsSELECT t1.* t2.*FROMt1 t

我的问题是。是否有任何情况下,低于三个查询会产生不同的输出?他们总是返回相同的数据集还是他们是任何异常。另外他们在性能上有什么不同?

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

加入(无“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, "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   |
+------+------+------+------+
2

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

在 MySQL 中,JOIN,CROSS JOIN 和 INNER JOIN 是语法等效项(它们可以相互替换)

...

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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(392)
小程序换行代码:换行时在“代码”环境中自动添加换行符号
上一篇
医疗机构代码查询入口:这个“医疗保健”数据库的sql查询代码是什么
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(73条)