web-dev-qa-db-fra.com

Comment fonctionne la clause LEFT JOIN with WHERE?

Compte tenu de la requête ci-dessous

    SELECT * FROM tableA 
    LEFT JOIN tableB ON tableB.id = tableA.id
    WHERE tableA.name = 'e'

.

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  

.

Ce qui me déroute, c'est le processus qui se déroule derrière.

Le système joint-il d'abord tableA et tableB avant de sélectionner uniquement la ligne de la clause WHERE?

Si oui, qu'en est-il de cette requête

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

) A LEFT JOIN tableB ON tableB.id = A.id 

Cette requête sélectionne-t-elle d'abord en utilisant la clause WHERE avant de JOINDRE l'autre table?

Désolé, je ne trouve pas la réponse sur le Web. Je voulais réduire la bande passante des ressources MySQL. La deuxième requête est-elle la meilleure pour cette situation?

4
Jam Ville

L'optimiseur de requête décidera et c'est assez intelligent.

SELECT * FROM tableA 
LEFT JOIN tableB 
  ON tableB.id = tableA.id
WHERE tableA.name = 'e'  

Il existe de nombreux cas où la jointure en premier est plus efficace. Si le nom est indexé et que "e" est quelque peu unique, le faire en premier est plus efficace.

Ceci est différent

SELECT * FROM tableA 
LEFT JOIN tableB 
  ON tableB.id = tableA.id
WHERE tableB.school = 'EE'   

Cela transforme la jointure gauche en jointure interne, mais comme il existe une correspondance dans vos données, vous obtiendrez les mêmes résultats.

5
paparazzo