LEFT JOIN with WHERE 子句如何工作?

Jam*_*lle 6 mysql join

鉴于下面的查询

    SELECT * FROM tableA 
    LEFT JOIN tableB ON tableB.id = tableA.id
    WHERE tableA.name = 'e'
Run Code Online (Sandbox Code Playgroud)

.

tableA                        tableB
-----------                   ----------- 
id    name                     id    school
-----------                   -----------  
1     a                         1     AA
2     b                         2     BB                     
3     c                         3     CC                     
4     d                         4     DD                     
5     e                         5     EE  
Run Code Online (Sandbox Code Playgroud)

.

令我困惑的是背后发生的过程。

在仅从 WHERE 子句中选择行之前,系统是否首先对 tableA 和 tableB 进行 JOIN?

如果是,那么这个查询呢

SELECT * FROM 
(
    SELECT * FROM tableA     
    WHERE name = 'e'

) A LEFT JOIN tableB ON tableB.id = A.id 
Run Code Online (Sandbox Code Playgroud)

此查询在连接另一个表之前是否先使用 WHERE 子句进行选择?

抱歉,我在网上找不到答案。我想减少 MySQL 资源带宽。第二个查询是否最适合这种情况?

pap*_*zzo 6

查询优化器会做出决定,它非常聪明。

SELECT * FROM tableA 
LEFT JOIN tableB 
  ON tableB.id = tableA.id
WHERE tableA.name = 'e'  
Run Code Online (Sandbox Code Playgroud)

在很多情况下,先进行连接会更有效。如果 name 已编入索引并且 'e' 有点独特,那么首先这样做会更有效率。

这是不同的

SELECT * FROM tableA 
LEFT JOIN tableB 
  ON tableB.id = tableA.id
WHERE tableB.school = 'EE'   
Run Code Online (Sandbox Code Playgroud)

这会将左连接更改为内连接,但由于您的数据中存在匹配项,因此您将获得相同的结果。