Если мы считаем, что вы используете INNER JOIN
вместо LEFT JOIN
(что, по-видимому, ваше намерение), эти два запроса функционально эквивалентны. Оптимизаторы запросов рассмотрят и оценят критерии в вашем WHERE
предложении и вашем FROM
предложении и учтут все эти факторы при построении планов запросов для достижения наиболее эффективного плана выполнения. Если мы выполним EXPLAIN
оба оператора, мы получим одинаковый результат:
Запрос 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
[Результаты] :
| 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 |
Запрос 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
[Результаты] :
| 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 |
Вы можете просмотреть полную информацию по следующим ссылкам. Я также создал пример SQL 2008, чтобы вы могли сравнить, как работают два движка (что одинаково):
Пример запроса MySQL
Пример запроса SQL 2008 (убедитесь, что вы «Просмотреть план выполнения» для обоих результатов)
INNER JOIN
, но сLEFT JOIN
этим будет возвращать другие результаты. В основном, условия, которые вы добавили вWHERE
свой второй запрос, конвертируют васJOIN
вINNER JOIN