Ответ
В стандартном SQL определены следующие основные типы JOIN:
| Тип JOIN | Описание |
|---|---|
INNER JOIN |
Возвращает только строки, где есть совпадение в обеих таблицах. |
LEFT (OUTER) JOIN |
Возвращает все строки из левой таблицы и совпадающие строки из правой. Если совпадения нет, поля правой таблицы будут NULL. |
RIGHT (OUTER) JOIN |
Возвращает все строки из правой таблицы и совпадающие строки из левой. Если совпадения нет, поля левой таблицы будут NULL. |
FULL (OUTER) JOIN |
Возвращает строки при наличии совпадения в любой из таблиц. Это комбинация LEFT и RIGHT JOIN. |
CROSS JOIN |
Возвращает декартово произведение строк обеих таблиц (каждую строку из таблицы A с каждой строкой из таблицы B). |
Дополнительные варианты:
SELF JOIN— соединение таблицы с самой собой (используется псевдонимы).NATURAL JOIN— неявное соединение по столбцам с одинаковыми именами (использовать не рекомендуется из-за непредсказуемости).
Пример INNER JOIN:
SELECT o.id AS order_id, c.name AS customer_name
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id;
Почему важно понимать различия? Выбор правильного типа JOIN напрямую влияет на корректность и полноту возвращаемых данных.
Ответ 18+ 🔞
Давайте разберём эти ваши JOIN'ы, а то некоторые думают, что это какой-то магический ритуал, а не простая хуйня.
Смотрите, есть у вас две таблицы. Представьте, что это два списка: один — список заказов, другой — список клиентов. И вам надо их как-то склеить, чтобы понять, кто что заказал. Вот для этого и нужны эти самые JOIN'ы, их всего несколько основных, но если перепутать — получите пиздец вместо отчёта.
INNER JOIN — это как самый строгий бухгалтер. Он вернёт тебе записи ТОЛЬКО там, где есть совпадение в обеих таблицах. Нет клиента для заказа? Нахуй такой заказ, его в отчёт не включаем. Это самый частый и надёжный вариант.
LEFT JOIN — тут уже повеселее. Он говорит: «Мне важна левая таблица (первая, которую ты написал в запросе)». Все её строки вернутся, даже если для них нет совпадения справа. Нет клиента? Окей, поля из правой таблицы просто будут NULL. Удобно, когда нужно увидеть ВСЁ из одного списка, даже пустоты.
RIGHT JOIN — это то же самое, что LEFT JOIN, но наоборот. Все строки из правой таблицы, даже если слева нихуя нет. Честно говоря, его почти не используют, потому что можно просто поменять таблицы местами и сделать LEFT JOIN — так понятнее.
FULL JOIN — это уже полный разгул демократии. Вернёт всё, что есть в обеих таблицах. Если есть совпадение — покажет вместе. Если нет — заполнит недостающее NULL. Полезная штука, но не все СУБД её поддерживают сходу.
CROSS JOIN — а это, блядь, математический извращенец. Он берёт каждую строчку из первой таблицы и приклеивает к КАЖДОЙ строчке из второй. Если в первой таблице 10 строк, а во второй 20 — получишь 200 строк на выходе. Декартово произведение, ёпта! Используется редко, иначе можно сгенерировать овердохуища данных.
А ещё есть:
SELF JOIN— когда таблица соединяется сама с собой. Например, чтобы найти сотрудников, которые работают в одном отделе. Просто даёшь ей два разных псевдонима (алиаса) и работаешь как с двумя разными.NATURAL JOIN— а вот это, ядрёна вошь, опасная хуйня. Он сам догадывается, по каким полям соединять, если имена столбцов совпадают. Звучит удобно, но один раз добавишь в таблицу новое поле с таким же именем — и запрос накроется медным тазом. Не рекомендую, доверия к нему — ноль ебать.
Вот тебе живой пример INNER JOIN'a:
SELECT o.id AS order_id, c.name AS customer_name
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id;
Здесь мы из таблицы orders (псевдоним o) соединяемся с customers (c) по полю customer_id. Вернутся только заказы, у которых есть прописанный клиент. Если клиент удалён — заказ в выборку не попадёт.
Почему это всё важно? Да потому что если ты вместо INNER JOIN по ошибке вставишь LEFT JOIN, то в отчёт начнут лезть все заказы, даже те, у которых клиент — хуй с горы. И потом будешь сидеть и думать: «Откуда тут столько NULL'ов, блядь?». Выбор JOIN'а — это фундамент, на котором стоит весь запрос. Перепутал — получил волнение ебать и переделку работы.