Ответ
CROSS JOIN с WHERE и JOIN ON могут давать одинаковый результат, но работают по-разному.
- CROSS JOIN создаёт декартово произведение таблиц (все возможные комбинации строк), а затем фильтрует результат с помощью
WHERE. Это неэффективно, так как сначала генерируется огромный промежуточный набор данных. - JOIN ON (обычно INNER JOIN) сразу соединяет строки только там, где выполняется условие соединения, не создавая лишних комбинаций. Это семантически правильный и производительный подход.
Пример:
-- CROSS JOIN + WHERE (неэффективно, особенно на больших таблицах)
SELECT *
FROM employees e
CROSS JOIN departments d
WHERE e.department_id = d.id;
-- JOIN ON (оптимальный и читаемый способ)
SELECT *
FROM employees e
JOIN departments d ON e.department_id = d.id;
Ключевые отличия:
- Производительность:
JOIN ONпочти всегда быстрее, так как СУБД может использовать индексы и оптимизировать план выполнения, не строя полный декартов продукт. - Читаемость:
JOIN ONявно указывает намерение — связать таблицы по определённому условию. - Семантика: Использование
CROSS JOINдля эквисоединения (=) считается антипаттерном.