Se considerarmos que você usa em INNER JOIN
vez de LEFT JOIN
(que parece ser sua intenção), essas duas consultas são funcionalmente equivalentes. Os otimizadores de consulta revisarão e avaliarão os critérios em sua WHERE
cláusula e sua FROM
cláusula e considerarão todos esses fatores ao criar planos de consulta para alcançar o plano de execução mais eficiente. Se fizermos um EXPLAIN
em ambas as instruções, obteremos o mesmo resultado:
Consulta 1 :
EXPLAIN
SELECT
tableA.ColA
,tableA.ColB
,tableA.ColC
,tableA.ColD
,tableA.ColE
FROM tableA
JOIN tableB ON tableA.ColA=tableB.ColA
WHERE
tableA.ColB=tableB.ColB
AND tableA.ColC=tableB.ColC
AND tableA.ColD=tableB.ColD
AND tableA.ColE=tableB.ColE
[Resultados] :
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA |
------------------------------------------------------------------------------------------------------------------------
| 1 | SIMPLE | tableA | ALL | (null) | (null) | (null) | (null) | 1 | |
| 1 | SIMPLE | tableB | ALL | (null) | (null) | (null) | (null) | 1 | Using where; Using join buffer |
Consulta 2 :
EXPLAIN
SELECT
tableA.ColA
,tableA.ColB
,tableA.ColC
,tableA.ColD
,tableA.ColE
FROM tableA
JOIN tableB ON tableA.ColA=tableB.ColA
AND tableA.ColB=tableB.ColB
AND tableA.ColC=tableB.ColC
AND tableA.ColD=tableB.ColD
WHERE
tableA.ColE=tableB.ColE
[Resultados] :
| ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS | KEY | KEY_LEN | REF | ROWS | EXTRA |
------------------------------------------------------------------------------------------------------------------------
| 1 | SIMPLE | tableA | ALL | (null) | (null) | (null) | (null) | 1 | |
| 1 | SIMPLE | tableB | ALL | (null) | (null) | (null) | (null) | 1 | Using where; Using join buffer |
Você pode revisar os detalhes completos com os seguintes links. Também criei um exemplo do SQL 2008 para que você possa comparar como os dois mecanismos funcionam (que é o mesmo):
Exemplo de consulta MySQL
Exemplo de consulta do SQL 2008 (verifique 'Exibir plano de execução' para os dois resultados)
INNER JOIN
, mas com umLEFT JOIN
isso retornará resultados diferentes. Basicamente, as condições que você adicionou naWHERE
em sua segunda consulta estão convertendo o seuJOIN
em umINNER JOIN