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

Ответ

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 для эквисоединения (=) считается антипаттерном.

Ответ 18+ 🔞

Ну ты представляешь, какие чудеса творятся в головах у людей, когда они пишут SQL? Ебать мои старые костыли, иногда смотришь на запрос и думаешь — чувак, ты гений или просто пизда с ушами?

Вот смотри, берут две таблицы и делают CROSS JOIN. Это ж, ёпта, как взять всех сотрудников и скрестить со всеми отделами. Получается овердохуища строк, каждая срака с каждым носом. А потом, уже после того как этот монстр родился, начинают его фильтровать через WHERE. Типа «ой, а теперь оставь только тех, у кого department_id совпадает». Да ты что, блядь, серьёзно? Это как купить все продукты в «Ашане», вывалить их у себя в гараже, а потом начать искать среди этой кучи именно ту пачку гречки, которая тебе нужна. Удивление пиздец, да?

А можно же по-человечески, ёб твою мать! JOIN ON — это когда ты сразу говоришь базе: «Слушай сюда, умная машина, соедини мне сотрудников с отделами, но только там, где айдишники совпадают». И база, не создавая эту хуйню размером с гору, сразу строит нормальные пары. Это как прийти в тот же «Ашан» и сразу спросить у работника: «Где гречка?». И тебя ведут прямо к ней. Разница-то какая, а?

-- Вот этот способ — для любителей страдать хуйнёй. 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. Производительность. На первом варианте твоя база данных будет пыхтеть, как паровоз, рожая этот декартовый ад. На втором — она сразу сообразит, что к чему, полезет в индексы и выдаст результат в разы быстрее. Доверия ебать ноль к тому, кто пишет CROSS JOIN для таких целей.
  2. Читаемость. Когда видишь JOIN ON, сразу ясно, что чувак хотел связать таблицы по конкретному полю. А когда видишь CROSS JOIN ... WHERE, возникает подозрение, ёбать чувствую, что автор либо не в теме, либо хитрая жопа, которая любит усложнять.
  3. Семантика. Использовать CROSS JOIN для обычного соединения по равенству — это чистый антипаттерн, мартышлюшка какая-то. Это как отвёрткой гвозди забивать. Вроде и забиваются, но все вокруг смотрят на тебя и думают: «Пидарас шерстяной, возьми молоток».

Короче, запомни раз и навсегда: если нужно просто соединить по условию — JOIN ON. CROSS JOIN оставь для тех редких случаев, когда тебе реально нужны ВСЕ комбинации всего со всем (например, для генерации сетки дат или каких-то тестовых данных). А так — не выёбывайся, пиши просто и понятно.