mysql - mysql的Join 顺序对查询结果产生影响?

  显示原文与译文双语对照的内容

有三个表,t1,t2,t3 。每个表都有一个字段。 这些sql对是相同的?


1.select t1.f,t2.f,t3.f from t1 left join t2 on t1.f =t2.f left join t3 on t1.f = t3.f



select t1.f,t2.f,t3.f from t1 left join t3 on t1.f =t3.f left join t2 on t1.f = t2.f



2.select t1.f,t2.f,t3.f from t1 left join t2 on t1.f =t2.f inner join t3 on t1.f = t3.f



select t1.f,t2.f,t3.f from t1 inner join t3 on t1.f =t3.f left join t2 on t1.f = t2.f



3.select t1.f,t2.f,t3.f from t1 left join t2 on t1.f =t2.f right join t3 on t1.f = t3.f



select t1.f,t2.f,t3.f from t1 right join t3 on t1.f =t3.f left join t2 on t1.f = t2.f



4.select t1.f,t2.f,t3.f from t1 left join t2 on t1.f =t2.f full join t3 on t1.f = t3.f



select t1.f,t2.f,t3.f from t1 full join t3 on t1.f =t3.f left join t2 on t1.f = t2.f



5.select t1.f,t2.f,t3.f from t1 left join t2 on t1.f =t2.f left join t3 on t2.f = t3.f



select t1.f,t2.f,t3.f from t1 left join (t2 left join t3 on t2.f = t3.f) on t1.f =t2.f



。保留两个表的任意两个表具有相同的Join 和同一个 Join 字段。 查询结果相同? 如何轻松理解?

我想知道如何证明它。 当我使用 oracle ( + ) 到 Join 表时,发现( + ) 没有显示表 Join order.if,结果是不同的,什么是oracle默认顺序。

我知道 t1 LEFT JOIN t2与 t2 LEFT JOIN t1不同,因为它转换为( + ) 是不同的sql 。 在sql中,你将它转换为( + ) 。

For t1.f, wiki explicit wiki explicit wiki last wiki convert convert wiki convert convert convert convert wiki convert convert 。 因此,如果sql对的结果是不同的,则会产生冲突。

时间: 原作者:

这是我的最佳选择:

一个 LEFT JOIN ~ ∪ ( 一个 ∩ B ) ~

正确的Join B ~ ( 一个 ∩ B ) ∪ B ~

一个完整的Join B ~ ∪ B

内部 Join B ~ ∩ B


#1


t1 ∪ (t1 ∩ t3) t1 ∪ (t1 ∩ t2)


~ t1 ~ t1 



#2


t1 ∩ t3 (t1 ∩ t3) ∪ (t1 ∩ t3 ∩ t2) 


~ t1 ∩ t3 ~ t1 ∩ t3 



#3


(t1 ∩ t3 ) ∪ t3 t3 ∪ (t1 ∩ t3 ∩ t2)


~ t3 ~ t3



#4


t1 ∪ t3 (t1 ∪ t3) ∪ (t1 ∪ (t1 ∩ t2))


~ t1 ∪ t3 ~ t1 ∪ t3



#5


(t1 ∪ (t1 ∩ t2)) ∪ (t1 ∩ t2 ∩ t3) t1 ∪ (t1 ∩ (t2 ∪ (t2 ∩ t3)))


~ t1 ∪ (t1 ∩ t2 ∩ t3) ~ t1 ∪ (t1 ∩ t2)


~ t1 ~ t1



我试图使它变得更短,即使是第一个表达也。 对于 #5 我让它更清晰一点。 如果你想看到完整的扩展表达式,让我知道。

原作者:

在 LEFT JOIN 中,结果是


from t1 left join t2 on t1.f1 = t2.f2 



可能不同于


from t2 left join t1 on t1.f1 = t2.f2 



如果第一个案例中的t1在第一个事例中没有选择行,请尝试使用空值。在第二情况下,在这些列中的行生成具有空值的列。

对于内部 Join,自然没有区别。

原作者:
...