Ответ
Эти операции объединения (JOIN) определяют, какие строки из соединяемых таблиц попадут в результирующий набор.
Типы JOIN (на примере таблиц Customers и Orders)
-
INNER JOIN
- Возвращает только те записи, для которых условие соединения (
ON) выполняется в обеих таблицах. - Записи без соответствия отбрасываются.
-- Только клиенты, у которых есть заказы SELECT * FROM Customers c INNER JOIN Orders o ON c.id = o.customer_id;
- Возвращает только те записи, для которых условие соединения (
-
LEFT (OUTER) JOIN
- Возвращает ВСЕ записи из левой таблицы (
Customers). - Для записей, у которых нет соответствия в правой таблице, поля из правой таблицы будут
NULL.-- Все клиенты, даже если у них нет заказов SELECT * FROM Customers c LEFT JOIN Orders o ON c.id = o.customer_id;
- Возвращает ВСЕ записи из левой таблицы (
-
RIGHT (OUTER) JOIN
- Возвращает ВСЕ записи из правой таблицы (
Orders). - Для записей, у которых нет соответствия в левой таблице, поля из левой таблицы будут
NULL. - На практике используется реже, так как его всегда можно заменить на
LEFT JOIN, поменяв таблицы местами.-- Все заказы, даже если для них нет записи о клиенте (аналог LEFT JOIN с переставленными таблицами) SELECT * FROM Customers c RIGHT JOIN Orders o ON c.id = o.customer_id;
- Возвращает ВСЕ записи из правой таблицы (
Визуализация
Часто используется мнемоника на основе диаграмм Венна или следующее правило:
- INNER JOIN = пересечение множеств.
- LEFT JOIN = всё левое множество + пересечение.
- RIGHT JOIN = всё правое множество + пересечение.
Ответ 18+ 🔞
Давай разберём эту хуйню с джойнами, а то народ путается, как слепой кот в сортире. Представь, что у тебя есть две таблицы: Customers (клиенты) и Orders (заказы). И нам надо их скрестить, как удава с хомяком.
Так, блядь, какие бывают скрещивания (JOIN)
-
INNER JOIN (Внутреннее скрещивание)
- Самый жадный, блядь. Берёт только то, что есть в обеих таблицах. Если у клиента нет заказа или заказ без клиента — нахуй такие записи, в помойку.
- Только взаимная любовь, никаких свободных отношений.
-- Дашь мне только тех клиентов, которые уже что-то купили? Остальные — лохи. SELECT * FROM Customers c INNER JOIN Orders o ON c.id = o.customer_id;
-
LEFT (OUTER) JOIN (Левое внешнее скрещивание)
- Вот это уже интереснее. Берём ВСЕХ клиентов, абсолютно всех, даже тех, кто только пришёл и нихуя не купил.
- Если заказа у клиента нет — поля из таблицы заказов будут просто
NULL. Типа, пусто, нихуя.-- Покажи мне всех клиентов, даже самых нищебродских! А заказы ихние — если есть. SELECT * FROM Customers c LEFT JOIN Orders o ON c.id = o.customer_id;
-
RIGHT (OUTER) JOIN (Правое внешнее скрещивание)
- Зеркальный уродец. Берёт ВСЕ заказы, даже те, которые, блядь, с небес упали, и к ним клиент не приписан.
- Если клиента для заказа нет — поля из таблицы клиентов будут
NULL. - Честно? Им почти не пользуются, ёпта. Потому что можно просто таблицы местами поменять и сделать
LEFT JOIN— и мозг не ебёт.-- Все заказы на свете, даже анонимные! (Но то же самое — LEFT JOIN, если таблицы переставить) SELECT * FROM Customers c RIGHT JOIN Orders o ON c.id = o.customer_id;
Как это запомнить, не сойдя с ума
Представь два круга, которые пересекаются, как сиськи в тесном лифчике.
- INNER JOIN — тебе только та самая область пересечения, где они соприкасаются. Всё остальное — неинтересно.
- LEFT JOIN — тебе весь левый круг (клиенты) целиком, и кусочек правого (заказы), который к нему прилип.
- RIGHT JOIN — то же самое, но наоборот: весь правый круг и прилипший кусок левого.
Вот и вся магия, блядь. Главное — не перепутай, а то получишь хуйню вместо отчёта.