Mysql中使用逗號隔開多張表生成的表例項

2021-09-09 07:57:35 字數 1732 閱讀 1668

摘自:

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'錯誤。

要啟用聯接,請使用以下任一策略:

優先順序相同的解釋也適用於與混合逗號操作語句inner joincross joinleft join,並且right join,所有這些都具有比逗號操作符更高的優先順序。

mysql 連表分組 多個欄位用逗號隔開

select group concat plate tag.plate id from tag left join plate tag on plate tag.tag id tag.id where tag deleted at is null and plate tag deleted at i...

MySQL 模糊查詢某字段用逗號隔開

1.查詢pnum欄位中包含3或者9的記錄 select from test where find in set 3 pnum or find in set 9 pnum select from test where concat pnum,regexp 0 9 3 9 0 9 2.cover欄位為 ...

MySQL 模糊查詢某字段用逗號隔開

1.查詢pnum欄位中包含3或者9的記錄 select from test where find in set 3 pnum or find in set 9 pnum select from test where concat pnum,regexp 0 9 3 9 0 9 2.cover欄位為 ...