MySQL中LEFTINNER JOIN是如何评估连接条件的?

2026-04-01 23:291阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计487个文字,预计阅读时间需要2分钟。

MySQL中LEFT/INNER JOIN是如何评估连接条件的?

我们提供了3个表格:T1、T2、T3。表格结构如下:

| id | t3_id | name | id | t2_id ||----|-------|------|----|-------|| 1 | 2 | abc | 1 | 12 || 2 | 123 | | | |

我们给出了3个表:T1:T2:T3:id|t3_idid|nameid|t2_id-----------------------------1|21|abc1|12|NULL2|1

我们给出了3个表:

T1: T2: T3:id | t3_id id | name id | t2_id---------- --------- ----------1 | 2 1 | abc 1 | 12 | NULL 2 | 123 2 | 13 | 1 3 | ab1 3 | 34 | 4 4 | 32b 4 | 2

现在我们测试了以下JOIN:

MySQL中LEFT/INNER JOIN是如何评估连接条件的?

1:

SELECT *FROM T1INNER JOIN T3 ON T1.t3_id = T3.idINNER JOIN T2 ON T3.t2_id = T2.idWHERE T2.name = '%'

这个案子很清楚.结果:

T1.id | T1.t3_id | T3.id | T3.t2_id | T2.id | T2.name-----------------------------------------------------1 | 2 | 2 | 1 | 1 | abc3 | 1 | 1 | 1 | 1 | abc4 | 4 | 4 | 2 | 2 | 123

2:

SELECT *FROM T1LEFT JOIN T3 ON T1.t3_id = T3.idLEFT JOIN T2 ON T3.t2_id = T2.idWHERE T2.name = '%'

这一点也很清楚:

T1.id | T1.t3_id | T3.id | T3.t2_id | T2.id | T2.name-----------------------------------------------------1 | 2 | 2 | 1 | 1 | abc2 | NULL | NULL | NULL | NULL | NULL3 | 1 | 1 | 1 | 1 | abc4 | 4 | 4 | 2 | 2 | 123

3:

SELECT *FROM T1LEFT JOIN T3 ON T1.t3_id = T3.idINNER JOIN T2 ON T3.t2_id = T2.idWHERE T2.name = '%'

这个有点奇怪.结果(与第一个相同):

T1.id | T1.t3_id | T3.id | T3.t2_id | T2.id | T2.name-----------------------------------------------------1 | 2 | 2 | 1 | 1 | abc3 | 1 | 1 | 1 | 1 | abc4 | 4 | 4 | 2 | 2 | 123

我不明白MySQL如何评估这个表达式.为什么它忽略LEFT JOIN并且似乎更喜欢INNER JOIN.

如果我读这个查询就像:

>从T1获取数据>通过LEFT JOIN从T2获取数据(表示:仅在可能的情况下,否则采用NULL数据)>通过INNER JOIN从T3获取数据(意味着:删除所有无法通过此INNER JOIN连接的T2数据)

但似乎我必须向后阅读查询?!

有人可以向我解释这个场景吗?

解决方法:

左连接类似于“OR”,INNER JOIN类似于“AND”.所以有这样的优先权

t1 left join (t2 inner join t3)

这与…有很大的不同

(t1 left join t2) inner join t2

标签:LEFTIN

本文共计487个文字,预计阅读时间需要2分钟。

MySQL中LEFT/INNER JOIN是如何评估连接条件的?

我们提供了3个表格:T1、T2、T3。表格结构如下:

| id | t3_id | name | id | t2_id ||----|-------|------|----|-------|| 1 | 2 | abc | 1 | 12 || 2 | 123 | | | |

我们给出了3个表:T1:T2:T3:id|t3_idid|nameid|t2_id-----------------------------1|21|abc1|12|NULL2|1

我们给出了3个表:

T1: T2: T3:id | t3_id id | name id | t2_id---------- --------- ----------1 | 2 1 | abc 1 | 12 | NULL 2 | 123 2 | 13 | 1 3 | ab1 3 | 34 | 4 4 | 32b 4 | 2

现在我们测试了以下JOIN:

MySQL中LEFT/INNER JOIN是如何评估连接条件的?

1:

SELECT *FROM T1INNER JOIN T3 ON T1.t3_id = T3.idINNER JOIN T2 ON T3.t2_id = T2.idWHERE T2.name = '%'

这个案子很清楚.结果:

T1.id | T1.t3_id | T3.id | T3.t2_id | T2.id | T2.name-----------------------------------------------------1 | 2 | 2 | 1 | 1 | abc3 | 1 | 1 | 1 | 1 | abc4 | 4 | 4 | 2 | 2 | 123

2:

SELECT *FROM T1LEFT JOIN T3 ON T1.t3_id = T3.idLEFT JOIN T2 ON T3.t2_id = T2.idWHERE T2.name = '%'

这一点也很清楚:

T1.id | T1.t3_id | T3.id | T3.t2_id | T2.id | T2.name-----------------------------------------------------1 | 2 | 2 | 1 | 1 | abc2 | NULL | NULL | NULL | NULL | NULL3 | 1 | 1 | 1 | 1 | abc4 | 4 | 4 | 2 | 2 | 123

3:

SELECT *FROM T1LEFT JOIN T3 ON T1.t3_id = T3.idINNER JOIN T2 ON T3.t2_id = T2.idWHERE T2.name = '%'

这个有点奇怪.结果(与第一个相同):

T1.id | T1.t3_id | T3.id | T3.t2_id | T2.id | T2.name-----------------------------------------------------1 | 2 | 2 | 1 | 1 | abc3 | 1 | 1 | 1 | 1 | abc4 | 4 | 4 | 2 | 2 | 123

我不明白MySQL如何评估这个表达式.为什么它忽略LEFT JOIN并且似乎更喜欢INNER JOIN.

如果我读这个查询就像:

>从T1获取数据>通过LEFT JOIN从T2获取数据(表示:仅在可能的情况下,否则采用NULL数据)>通过INNER JOIN从T3获取数据(意味着:删除所有无法通过此INNER JOIN连接的T2数据)

但似乎我必须向后阅读查询?!

有人可以向我解释这个场景吗?

解决方法:

左连接类似于“OR”,INNER JOIN类似于“AND”.所以有这样的优先权

t1 left join (t2 inner join t3)

这与…有很大的不同

(t1 left join t2) inner join t2

标签:LEFTIN