Якщо ми вважаємо, що ви використовуєте 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