Mysql中使用逗号隔开多张表生成的表实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tfstone/article/details/86527070

摘自:https://dev.mysql.com/doc/refman/5.7/en/join.html

Mysql中使用使用逗号隔开多张表生成的表实例 等价于 使用Join、Inner Join、Cross Join,而在标准sql中,它们并不等价,Inner Join 和 on 一起使用,Cross Join则使用其它方式;

SELECT * FROM t1 LEFT JOIN (t2, t3, t4)
                 ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)

is equivalent to:

SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)
                 ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)

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

然而,逗号运算符的优先级低于的INNER JOINCROSS JOINLEFT JOIN。如果在存在连接条件时将逗号连接与其他连接类型混合,则可能会出现表单错误,如:Unknown column 'col_name' in 'on clause'

 

JOIN优先级高于逗号运算符(,),因此连接表达式 t1, t2 JOIN t3被解释为 (t1, (t2 JOIN t3)),而不是((t1, t2) JOIN t3)。这会影响使用ON子句的语句, 因为该子句只能引用连接操作数中的列,并且优先级会影响对这些操作数的解释。eg:

CREATE TABLE t1 (i1 INT, j1 INT);
CREATE TABLE t2 (i2 INT, j2 INT);
CREATE TABLE t3 (i3 INT, j3 INT);
INSERT INTO t1 VALUES(1, 1);
INSERT INTO t2 VALUES(1, 1);
INSERT INTO t3 VALUES(1, 1);
SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);

JOIN优先级比逗号高,所以对于操作数ON 子句t2t3。因为t1.i1不是任何一个操作数中的列,结果是Unknown column 't1.i1' in 'on clause'错误。

要启用联接,请使用以下任一策略:

  • 使用括号显式地对前两个表进行分组,以使ON 子句的操作数为(t1, t2)和 t3:

    SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);
  • 避免使用逗号运算符JOIN而是使用 :

    SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);

优先级相同的解释也适用于与混合逗号操作语句INNER JOINCROSS JOINLEFT JOIN,并且RIGHT JOIN,所有这些都具有比逗号操作符更高的优先级。

猜你喜欢

转载自blog.csdn.net/tfstone/article/details/86527070