Se consideriamo che usi INNER JOINinvece di LEFT JOIN(che sembra essere il tuo intento), queste due query sono funzionalmente equivalenti. Gli ottimizzatori di query riesamineranno e valuteranno i criteri nella tua WHEREclausola e nella tua clausola e terranno FROMconto di tutti questi fattori durante la costruzione di piani di query al fine di raggiungere il piano di esecuzione più efficiente. Se facciamo EXPLAINentrambe le affermazioni, otteniamo lo stesso risultato:
Query 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
[Risultati] :
| 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 |
Query 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
[Risultati] :
| 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 |
È possibile rivedere i dettagli completi con i seguenti collegamenti. Ho anche creato un esempio di SQL 2008 in modo da poter confrontare il funzionamento dei due motori (che è lo stesso):
Esempio di query MySQL
Esempio di query SQL 2008 (assicurati di 'Visualizza piano di esecuzione' per entrambi i risultati)
INNER JOIN, ma conLEFT JOINquesto restituirà risultati diversi. Fondamentalmente, le condizioni che hai aggiunto sullaWHEREtua seconda query stanno convertendo il tuoJOINsuINNER JOIN