Si consideramos que usa en INNER JOIN
lugar 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 WHERE
cláusula y su FROM
clá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 EXPLAIN
en 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 JOIN
esto devolverá resultados diferentes. Básicamente, las condiciones que agregó enWHERE
su segunda consulta están convirtiendo suJOIN
en unINNER JOIN