В чем разница между INNER JOIN и OUTER JOIN в SQL?

Ответ

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 — это уже гуманитарная акция, там всем сестрам по серьгам. Их три вида, эти распиздяи:

  1. LEFT JOIN — Всех клиентов из левой таблицы загоняем в результат, даже если они лузеры и ни одного заказа не сделали. Их несчастную пару (order_date) просто заполняем NULL'ами, типа «место пустое».
  2. RIGHT JOIN — То же самое, но наоборот: тащим всех заказов, даже если клиент на них нихуя не находится.
  3. 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 по жизни устроит, что мало не покажется.