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

Ответ

INNER JOIN возвращает только те строки, для которых условие соединения (ON) выполняется в обеих таблицах. Строки без пары отбрасываются.

LEFT JOIN (или LEFT OUTER JOIN) возвращает все строки из левой (первой) таблицы, даже если для них нет совпадения в правой таблице. В таком случае все столбцы из правой таблицы в результирующей строке будут содержать NULL.

Визуализация:

Таблица A        Таблица B        INNER JOIN A и B      LEFT JOIN A и B
--------        --------        ---------------      ---------------
id | name      id | value      A.id | A.name | B.value   A.id | A.name | B.value
1  | Alice     1  | 100        1    | Alice  | 100       1    | Alice  | 100
2  | Bob       3  | 300        3    | Carol  | 300       2    | Bob    | NULL
3  | Carol                                    3    | Carol  | 300

Пример SQL-запросов:

-- INNER JOIN: Только клиенты, сделавшие заказы.
SELECT c.id, c.name, o.order_date
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id;

-- LEFT JOIN: Все клиенты, даже те, кто не делал заказов.
SELECT c.id, c.name, o.order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.order_date IS NULL; -- Частый случай: найти клиентов без заказов.

Практическое правило:

  • Используйте INNER JOIN, когда вам нужны только связанные данные из обеих таблиц.
  • Используйте LEFT JOIN, когда вам нужны все записи из основной (левой) таблицы, и дополнительная информация из связанной таблицы — если она есть.

Ответ 18+ 🔞

Давай разберём эту пиздопроебищну про JOIN'ы, чтобы у тебя в башке всё встало на свои ебучки-воробушки.

Представь, что у тебя есть две таблицы. Одна — это список твоих корешей, вторая — список долгов, которые они тебе должны. Вот и вся хуйня.

INNER JOIN — это как самый жадный и принципиальный коллектор. Он смотрит на обе таблицы и говорит: «Хуй с горы, чувак! Я верну тебе только тех, кто и в списке друзей и в списке должников!». Кто не должен — тот для него не существует, нахуй выкидывается. Только пересечение, только хардкор.

LEFT JOIN — это уже более лояльный тип, можно сказать, хитрая жопа. Он говорит: «Ладно, покажи мне всех своих друзей из левой таблицы. А из правой таблицы с долгами — прицепляй инфу, если должок есть. Если нет — ну и похуй, я просто поставлю NULL». То есть все друзья останутся в выдаче, даже те, кто нихуя не должен.

Вот тебе визуализация, чтобы не бздеть:

Друзья (A)        Долги (B)        INNER JOIN A и B      LEFT JOIN A и B
--------        --------        ---------------      ---------------
id | имя       id | сумма      A.id | A.имя | B.сумма   A.id | A.имя | B.сумма
1  | Вася      1  | 100р       1    | Вася  | 100р      1    | Вася  | 100р
2  | Петя      3  | 300р       3    | Коля  | 300р      2    | Петя  | NULL
3  | Коля                                    3    | Коля  | 300р

Видишь? INNER JOIN проигнорировал Петю, потому что тот, сука, чист перед законом. А LEFT JOIN его оставил, но с пустым кошельком в графе долга.

Примеры запросов, чтобы ты окончательно не охуел:

-- INNER JOIN: Только те, кто и друг, и должник. Реальные пацаны.
SELECT c.id, c.name, o.order_date
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id;

-- LEFT JOIN: Все клиенты, даже те, кто нихуя не купил. А потом находим этих пидарасов.
SELECT c.id, c.name, o.order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.order_date IS NULL; -- Вот они, сраные халявщики!

Практическое правило, которое тебя спасёт:

  • INNER JOIN — когда тебе нужны только пары, только взаимные отношения. «Покажи пользователей, у которых есть заказы».
  • LEFT JOIN — когда тебе нужны ВСЕ записи из главной таблицы, а данные из второй — так, по приколу, если есть. «Покажи всех пользователей и их заказы, если они вдруг были». Особенно кайфово искать WHERE ... IS NULL — это те, кто нихуя не сделал.