Ответ
INNER JOIN возвращает только строки, для которых есть совпадение в обеих таблицах по условию соединения. Строки без совпадения исключаются из результата.
OUTER JOIN возвращает все строки из одной или обеих таблиц, дополняя отсутствующие совпадения значениями NULL. Существует три типа:
- LEFT (OUTER) JOIN: Все строки из левой таблицы + совпадения из правой.
- RIGHT (OUTER) JOIN: Все строки из правой таблицы + совпадения из левой.
- FULL (OUTER) JOIN: Все строки из обеих таблиц.
Пример:
-- INNER JOIN: Только клиенты, сделавшие заказы
SELECT c.name, o.order_date
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id;
-- LEFT JOIN: Все клиенты, даже без заказов
SELECT c.name, o.order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id;
-- Для клиентов без заказов order_date будет NULL
Почему это важно: Выбор типа JOIN определяет, какие данные попадут в результат. INNER JOIN используется для получения связанных данных, а OUTER JOIN — для сохранения всех записей из основной таблицы, даже если связей нет.
Ответ 18+ 🔞
А, ну вот, опять про эти ваши JOIN'ы! Слушай, давай я тебе на пальцах, а то у тебя там в глазах уже квадратики пляшут.
Представь себе две тусовки. Одна — это таблица customers (клиенты), другая — orders (заказы). И вот они пытаются познакомиться.
INNER JOIN — это как строгий вышибала на входе в клуб. Он пропускает ТОЛЬКО тех, у кого есть пара. То есть клиента — только если у него есть заказ, и заказ — только если есть клиент. Одинокие чуваки и заказы-сироты остаются на улице морозить очко. Жёстко, зато по делу.
-- Только парочки, которые нашли друг друга
SELECT c.name, o.order_date
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id;
А теперь OUTER JOIN — это уже гуманитарная акция, там всем сестрам по серьгам. Их три вида, эти распиздяи:
- LEFT JOIN — Всех клиентов из левой таблицы загоняем в результат, даже если они лузеры и ни одного заказа не сделали. Их несчастную пару (
order_date) просто заполняемNULL'ами, типа «место пустое». - RIGHT JOIN — То же самое, но наоборот: тащим всех заказов, даже если клиент на них нихуя не находится.
- FULL JOIN — А это вообще пиздец, бардак полный. Тащим ВСЕХ и отовсюду! И клиентов-лузеров, и заказы-сироты. Кто нашёл пару — молодцы, кто нет — сидят с
NULLнапротив.
-- LEFT JOIN: Все клиенты, даже те, кто нихуя не купил
SELECT c.name, o.order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id;
-- У Васечкина в order_date будет NULL, потому что он только пришёл потусить
А почему это, блядь, важно? Да всё просто, ёпта! INNER JOIN — когда тебе нужны только факты, только связанные данные. Сделал заказ — молодец, покажись в отчёте. Не сделал — иди нахуй, тебя в статистике нет.
А OUTER JOIN (чаще всего LEFT) — когда тебе важна полнота картины из главной таблицы. Всех клиентов надо пересчитать, даже самых беспонтовых, чтобы понять, кто из них просто тянет резину. Иначе потом начальник придёт и спросит: «А где, сука, Петров? Он что, с концами?». А он просто ни разу не заказал, хитрая жопа.
Вот и вся философия, в рот меня чих-пых. Не запутайся только, а то SQL тебе такого FULL JOIN по жизни устроит, что мало не покажется.