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