Si consideramos que usa en INNER JOINlugar de LEFT JOIN(lo cual parece ser su intención), estas dos consultas son funcionalmente equivalentes. Los optimizadores de consultas revisarán y evaluarán los criterios en su WHEREcláusula y su FROMcláusula y considerarán todos estos factores al crear planes de consulta para alcanzar el plan de ejecución más eficiente. Si hacemos un EXPLAINen ambas declaraciones, obtenemos el mismo 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 |
Puede revisar los detalles completos con los siguientes enlaces. También creé un ejemplo de SQL 2008 para que pueda comparar cómo funcionan los dos motores (que es lo mismo):
Ejemplo de consulta MySQL
Ejemplo de consulta SQL 2008 (asegúrese de 'Ver plan de ejecución' para ambos resultados)
INNER JOIN, pero con unLEFT JOINesto devolverá resultados diferentes. Básicamente, las condiciones que agregó enWHEREsu segunda consulta están convirtiendo suJOINen unINNER JOIN