В чём разница между CROSS JOIN с WHERE и обычным JOIN ON?

«В чём разница между CROSS JOIN с WHERE и обычным JOIN ON?» — вопрос из категории SQL и базы данных, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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;

Ключевые отличия:

  1. Производительность: JOIN ON почти всегда быстрее, так как СУБД может использовать индексы и оптимизировать план выполнения, не строя полный декартов продукт.
  2. Читаемость: JOIN ON явно указывает намерение — связать таблицы по определённому условию.
  3. Семантика: Использование CROSS JOIN для эквисоединения (=) считается антипаттерном.